编写一个链表结构,读取任意多个用户输入。之后将“2017000 85.0”和“2017006 85.0”“2017013 85.0”这三个数据插入链表,再将链表数据打印
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> //malloc free等函数会使用到这头文件
//定义链表的节点
typedef struct node_s {
long num; //学号
float score; //成绩
struct node_s* next; //指向链表下一个节点的指针
} node_t;
//node_t是typedef定义出来的节点类型
//n用来统计链表的长度
int n;
//创建一个包含学生信息的链表
node_t* create()
{
//申请头指针,和两个操作用的指针p1 p2
node_t *head, *p1, *p2;
//初始化数据
n = 0; //n用来统计链表的长度,初始化为0
head = NULL; //头指针初始化为NULL指针,链表为空
//循环读取用户输入,直到读取到学号为0时,认为输入结束
while (1) {
//申请内存来创建节点,用p1指向新申请的节点
//正常这里要判断一下p1是否为NULL,这里省略
p1 = (node_t*) malloc(sizeof(node_t));
//读取用户输入数据
scanf("%ld %f", &p1->num, &p1->score);
//如果读取到学号为0时,认为输入结束
if(p1->num == 0){
//本节点即尾节点,next设置为空指针
p2->next = NULL;
//p1节点为0的无需使用,要释放内存,书上漏了
free(p1);
break;
}
//链表长度加1
n++;
if (n == 1) {
//如果链表长度为1,说明当前节点p1是首节点
//用head记录下当前首节点
head = p1;
} else {
//如果链表长度不为1,说明当前节点p1不是首节点
//用上一个节点P2的next记录下当前节点
p2->next = p1;
}
//p2记录下本轮的节点,用于下一轮有新节点时,
//在p2->next = p1;语句中使用
p2 = p1;
}
//返回新生成的链表的首节点,用于外部访问链表
return (head);
}
//遍历链表,打印节点内容
void print(node_t *head)
{
node_t *p;
//如果链表为空,则不用访问了,直接返回
if (head == NULL) {
return;
}
//p初始化为head指向的链表首元素
for (p = head; p != NULL; p = p->next) {
//如果p指向的不是空指针,则访问它的数据
printf("%ld %5.1f\n", p->num, p->score);
//访问完数据后,p要指向当前元素的下一个元素 p = p->next
}
//如果p指向的是空指针,则跳出循环
}
//遍历链表,将新节点stud插入到链表中的适当位置,保证链表的学号顺序从小到大
node_t *insert(node_t *head, node_t *stud)
{
node_t *p0, *p1, *p2;
p1 = head;
p0 = stud;
//创建首节点
if (head == NULL) {
head = p0;
p0->next = NULL;
n++;
return head;
}
//找到插入位置
for (p1 = head; p1->next != NULL; p2=p1, p1 = p1->next) {
if(p0->num < p1->num) {
break;
}
}
if (p0->num <= p1->num) {
if (p1 == head) { //找到插入位置,插入队首
head = p0;
p0->next = p1;
} else { //找到插入位置,插入队列中间位置
p2->next = p0;
p0->next = p1;
}
} else {//找不到插入位置,插入队尾
p1->next = p0;
p0->next = NULL;
}
n++;
return head;
}
//插入
node_t* test_14_3(void)
{
node_t* head;
node_t* stud;
head = create();
//插入头部
stud = (node_t*) malloc(sizeof(node_t));
stud->num = 2017000;
stud->score = 85.0;
head = insert(head, stud);
//插入中间
stud = (node_t*) malloc(sizeof(node_t));
stud->num = 2017006;
stud->score = 85.0;
head = insert(head, stud);
//插入尾部
stud = (node_t*) malloc(sizeof(node_t));
stud->num = 2017013;
stud->score = 85.0;
head = insert(head, stud);
print(head);
return head;
}
int main(void)
{
test_14_3();
}
输入
2017001 81.0
2017002 82.0
2017003 83.0
2017004 84.0
2017005 85.0
2017010 90.0
0 0
输出
2017000 85.0
2017001 81.0
2017002 82.0
2017003 83.0
2017004 84.0
2017005 85.0
2017006 85.0
2017010 90.0
2017013 85.0