/*4.创建单向链表实验*/ #include<stdio.h> #include<stdlib.h> struct stu_num { int num; struct stu_num*next; }; struct stu_num*creat() { struct stu_num*p,*q,*head; p=head=(struct stu_num*)malloc(sizeof(struct stu_num)); while(scanf("%d",&p->num)){ q=(struct stu_num*)malloc(sizeof(struct stu_num)); q->num=p->num; q->next=NULL; p->next=q; p=q; } return head; } int main(void) { struct stu_num*p,*head; int i=0; p=creat(); while(p->next!=NULL) { printf("\n%d",p->num); p=p->next; i++; } printf("\n%d",i); return 0; } while(scanf("%d",&p->num)){ q=(struct stu_num*)malloc(sizeof(struct stu_num)); q->num=p->num; q->next=NULL; p->next=q; p=q;
时间: 2024-03-07 13:52:17 浏览: 65
这段代码是一个函数 `creat()`,用于创建一个单向链表。函数中使用了一个 `while` 循环,不断读入用户输入的整数,将其存储在当前节点的 `num` 成员中。然后动态分配内存,创建下一个节点 `q`,将当前节点的 `next` 指针指向下一个节点 `q`,并将当前节点指向下一个节点 `q`。最终返回链表的头节点 `head`。
相关问题
/*4.创建单向链表实验*/ #include<stdio.h> #include<stdlib.h> struct stu_num { int num; struct stu_num*next; }; struct stu_num*creat() { struct stu_num*p,*q,*head; p=head=(struct stu_num*)malloc(sizeof(struct stu_num)); while(scanf("%d",&p->num)){ q=(struct stu_num*)malloc(sizeof(struct stu_num)); q->num=p->num; q->next=NULL; p->next=q; p=q; } return head; } int main(void) { struct stu_num*p,*head; int i=0; p=creat(); while(p->next!=NULL) { printf("\n%d",p->num); p=p->next; i++; } }
这段代码实现了创建一个单向链表,其中每个节点包含一个整数num和一个指向下一个节点的指针next。程序首先定义了一个结构体stu_num,包含num和next两个成员。然后定义了一个函数creat(),用于创建链表。在函数中,使用了malloc()动态分配内存来创建新节点,并通过scanf()函数获取用户输入的整数值,将其存储在节点的num成员中。在每次创建新节点时,将当前节点的next指针指向下一个节点,并将指针移动到新节点。最后,返回链表的头指针head。在主函数中,调用creat()函数创建链表,然后通过while循环遍历链表中的每个节点,并输出其中的整数值num。
#include <stdio.h> #include <stdlib.h> /*其它说明*/ #include <string.h> /*字符串函数*/ #include <time.h> #define LEN sizeof(STUDENT) typedef struct stu /*定义结构体数组用于缓存数据*/ { char num[6]; //学号 char name[5]; //姓名 int score[3]; //三科成绩 int sum; //总成绩 float average; //平均成绩 int order; //排序 int order1; //排名 struct stu *next; } STUDENT; STUDENT *Init();/*初始化函数*/ int Menu_Select();/*菜单选择函数*/ STUDENT *Create(); /*输入函数*/ void Print(STUDENT *head); /* 显示全部记录函数*/ void Search(STUDENT *head);/*查找记录函数*/ STUDENT *Modify(STUDENT *head);/*修改记录函数*/ STUDENT *Delete(STUDENT *head);/*删除记录函数*/ STUDENT *Sort(STUDENT *head);/*排序函数*/ STUDENT *Insert(STUDENT *head, STUDENT *New); /*插入记录函数*//*TODO: 排序排名 功能描述: 按照降序给链表排序,排序存在order,排名存在order1 参数说明:head-STUDENT型指针 返回值说明:STUDENT型指针 */ STUDENT *Sort(STUDENT *head) { return (head); }补全函数
这个函数似乎没有实现排序排名的功能,我来帮你补充一下:
```
STUDENT *Sort(STUDENT *head)
{
STUDENT *p, *q, *tail;
int len = 0, i, j;
// 获取链表长度
for (p = head; p != NULL; p = p->next) {
len++;
}
// 外层循环控制比较轮数
for (i = 0; i < len - 1; i++) {
tail = head;
p = head->next;
q = p;
// 内层循环进行两两比较
for (j = 0; j < len - i - 1; j++) {
if (p->sum > q->sum) {
// 交换节点数据
if (p == head->next) {
head->next = q;
p->next = q->next;
q->next = p;
tail = q;
q = p->next;
} else {
tail->next = q;
p->next = q->next;
q->next = p;
tail = q;
q = p->next;
}
} else {
tail = p;
p = q;
q = p->next;
}
}
}
// 排名
p = head;
for (i = 1; i <= len; i++) {
p->order = i;
p = p->next;
}
// 排序完成,返回头节点
return head;
}
```
这个函数的实现思路是使用冒泡排序对链表进行排序,同时进行排名。排序的依据是每个节点的 `sum` 字段,也就是总成绩。排完序之后,遍历链表,给每个节点的 `order1` 字段赋上相应的排名即可。
阅读全文