c语言 利用链表建立一个数组,用户输入N,再输入N个数,计算其中的最小值位置(从1开始编号)。 1、 设计结构体和主函数的编写; 2、 建立链表(包括读取数据); 函数原型:struct node * Create(); 3、 输出这N个数; 函数原型:void Print(struct node * head); 4、 找出最小值的位置; 函数原型:int Min(struct node * head);
时间: 2024-03-11 17:50:14 浏览: 54
好的,这道题目我已经在上一个回答中给出了每位同学需要完成的任务,现在我来给出完整的代码实现。
首先是链表节点的结构体定义:
```c
struct node {
int data; // 存储数据的变量
struct node *next; // 指向下一个节点的指针
};
```
接下来是主函数的实现:
```c
int main() {
int n; // 用户输入的N
printf("请输入N:");
scanf("%d", &n);
struct node *head = Create(); // 创建链表并读取数据
Print(head); // 输出这N个数
int min_pos = Min(head); // 找出最小值的位置
printf("最小值的位置是:%d\n", min_pos);
return 0;
}
```
我们可以看到,主函数中先读取了用户输入的N,然后调用Create函数创建链表并读取数据,接着调用Print函数输出这N个数,最后调用Min函数找出最小值的位置并输出。
下面是Create函数的实现:
```c
struct node * Create() {
int n; // 用户输入的N
printf("请输入%d个整数:", n);
scanf("%d", &n);
struct node *head = NULL; // 链表的头节点指针
struct node *tail = NULL; // 链表的尾节点指针
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
struct node *p = (struct node *)malloc(sizeof(struct node)); // 动态分配内存创建节点
p->data = x;
p->next = NULL;
if (head == NULL) {
head = p;
} else {
tail->next = p;
}
tail = p;
}
return head;
}
```
Create函数首先读取用户输入的N,然后使用for循环读取N个数,并依次插入到链表中。在插入节点之前,需要使用malloc函数动态分配内存来创建一个新节点。如果链表是空的,那么新节点就是头节点;否则,将新节点插入到链表的末尾。
下面是Print函数的实现:
```c
void Print(struct node * head) {
printf("这%d个数是:", Count(head));
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
```
Print函数接受链表的头节点的指针作为参数,然后遍历整个链表,依次输出每个节点的数据。注意,这里我还调用了Count函数来统计链表中节点的个数,以便在输出时给出正确的个数。
最后是Min函数的实现:
```c
int Min(struct node * head) {
int pos = 1; // 最小值的位置,从1开始编号
int min = head->data; // 最小值,初始值为第一个节点的数据
while (head != NULL) {
if (head->data < min) {
min = head->data;
pos = Count(head) - Count(head->next) + 1; // 计算最小值的位置
}
head = head->next;
}
return pos;
}
```
Min函数接受链表的头节点的指针作为参数,然后遍历整个链表,找出最小值所在的节点,并返回它的位置。在找到最小值的节点时,还需要计算出它的位置。这里我又调用了Count函数来统计链表中节点的个数,并使用这个函数来计算节点的位置。
完整的代码实现如下:
阅读全文