博客
关于我
现有一串已按分数高低记录好的成绩, 现在要求你在不打乱原来顺序的基础上 插入一部分数据、删除一部分数据,并输出。
阅读量:240 次
发布时间:2019-03-01

本文共 2843 字,大约阅读时间需要 9 分钟。

现有一串已按分数高低记录好的成绩,现在要求你在不打乱原来顺序的基础上插入一部分数据、删除一部分数据,并输出。(用链表操作)输入输入分3部分:第一部分为已排序好的成绩,#结束;第二部分为要增加的成绩,#结束:第三部分为要删除的成绩,#结束;输出输出修改后的成绩样例输入LI 95WANG 90SUN 85ZHAO 80QIAN 70#ZHAN 85JIN 60#QIAN#样例输出LI 95WANG 90SUN 85ZHAN 85ZHAO 80JIN 60 */#include 
#include
#include
int main(){ struct stu { char name[20]; int score; struct stu *next; } *head = NULL, *pnow, /* 新增节点的指针. /欲删除的节点指针*/ *p, /* 母链表的当前位置的指针 */ /* 它是独立于链表之外的工作人员般的存在,通过它来访问(操作/修改)他所指的结构体元素的内容, */ *pre; /* 保存前一个节点的地址(外地址) */ char buf[20]; /* 数据缓冲区 ,当需要读入的数据比较多样,考虑先放入缓冲区再解析会比较灵活. buf里面可能存放的内容有两类:1.名字/2.'#' (而分数不会进去的(scanf(%s遇到空格结束读入.))) */ int size_stu = sizeof(struct stu); /* 原来的母链表 头部. */ /* 新增节点的指针. */ pnow = (struct stu *)malloc(size_stu); /* 初始化头部和尾部得指针. */ p = head = pnow; /* 读入第一行数据 并写入到母链表的表头元素中去*/ scanf("%s %d", &pnow->name, &pnow->score); /* 第二行起需要分析读入到缓冲区里的内容 */ while (scanf("%s", &buf) != EOF) { if (buf[0] == '#') /*到头了, 结束该母链表的读入 */ { break; } else { /* 处理(建立下一个元素 )包括申请节点,连接节点内地址,更新(工作者指针的指向关系)(节点外地址操作)*/ pnow = (struct stu *)malloc(size_stu); /* 连接并更新节点里的指针 */ p->next = pnow; /* 连接到下一个元素 (采用上一个连接到当前,而非当前连接到下一个)(修改p所指节点的内地址.)*/ p = pnow; /* 更新节点里的指针 (将当前节点的外地址赋给p*/ /* 数据写入到当前. */ strcpy(pnow->name, buf); scanf("%d", &pnow->score); } } p->next = NULL; /* 处理增加的items,仍然采取一个一个节点的申请,连接 */ while (scanf("%s", &buf) != EOF) { if (buf[0] == '#') { break; } else { pnow = (struct stu *)malloc(size_stu); strcpy(pnow->name, buf); scanf("%d", &pnow->score); p = head->next; /* 保存母链表的首节点的内地址.(第二个节点的地址(如果有的话)) */ pnow->next = NULL; /* 当前接节点默认独立 */ /* 比较大小(都从母表头比起.),再合适的位置插入节点. */ if (pnow->score > head->score) /* 接到头部去 */ { pnow->next = head; head = pnow; /* 更新指向头部指针head */ } else { /* p = head->next; */ pre = head; /* p->score 原链表第二个节点里的分数. pre,和 p 是母链表中一前一后的关系. <= 表示新节点尽量靠后.*/ while (p != NULL && pnow->score <= p->score) /* 如果仍然小于等于,继续后移. */ { pre = p; p = p->next; /* 统称指向下一个节点. */ } pnow->next = p; /* 为了防止链表断了,应该从后往前作连接工作. */ pre->next = pnow; //被赋新值的同时就断开了旧有的链接 } } } /* 匹配姓名,删除节点. */ while (scanf("%s", &buf) != EOF) { if (buf[0] == '#') break; else { if (!strcmp(head->name, buf)) /* 匹配成功. */ { p = head; head = head->next; /*丢弃旧头部 */ } else { p = head->next; /* p母链表的当前位置的指针 */ pre = head; /* 当前节点不是最后一个同时 里面的名字不匹配 */ while (p != NULL && strcmp(p->name, buf) != 0) { /* p,pre各自指向自己的下一个节点. */ p = p->next; pre = pre->next; } pre->next = p->next; p->next = NULL; } free(p); } } /* 打印内容. */ p = head; for (; p != NULL;) { printf("%s %d\n", p->name, p->score); p = p->next; } /* while (p != NULL) { printf("%s %d\n", p->name, p->score); p = p->next; } */ return 0;}

转载地址:http://znzt.baihongyu.com/

你可能感兴趣的文章
MySQL-连接
查看>>
mysql-递归查询(二)
查看>>
MySQL5.1安装
查看>>
mysql5.5和5.6版本间的坑
查看>>
mysql5.5最简安装教程
查看>>
mysql5.6 TIME,DATETIME,TIMESTAMP
查看>>
mysql5.6.21重置数据库的root密码
查看>>
Mysql5.6主从复制-基于binlog
查看>>
MySQL5.6忘记root密码(win平台)
查看>>
MySQL5.6的Linux安装shell脚本之二进制安装(一)
查看>>
MySQL5.6的zip包安装教程
查看>>
mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
查看>>
Webpack 基本环境搭建
查看>>
mysql5.7 安装版 表不能输入汉字解决方案
查看>>
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>