根据P257页例题3-18要求,编写一个链表结构,读取任意多个用户输入。之后将“2017001 81.0”和“2017005 85.0”“2017010 90.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指向的是空指针,则跳出循环
}
//遍历链表,根据学号num找到对应的节点的指针,并删除该节点
node_t *del(node_t *head, int num)
{ node_t *p1, *p2;
if (head == NULL) {
printf("list is NULL\n");
return head;
}
for (p1 = head; p1->next != NULL; p2=p1, p1=p1->next) {
if(num == p1->num){
break;
}
}
if (num == p1->num) {
if (p1 == head) {
head = p1->next;
} else {
p2->next = p1->next;
}
free(p1); //书上漏了释放内存
p1 = NULL;
n--;
return head;
} else {
printf("not exist: num %d\n", num);
return head;
}
}
//删除
void test_14_4(void)
{
node_t* head;
head = create();
//删除头部节点
head = del(head, 2017001);
//删除中间节点
head = del(head, 2017005);
//删除尾部节点
head = del(head, 2017010);
print(head);
}
int main(void)
{
test_14_4();
}
输入
2017001 81.0
2017002 82.0
2017003 83.0
2017004 84.0
2017005 85.0
2017010 90.0
0 0
输出
2017002 82.0
2017003 83.0
2017004 84.0