• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

wchenfeng

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

根据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

posted on 2022-04-12 20:03  王陈锋  阅读(18)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3