哈尔滨工业大学 C语言课程设计(报告) 2011年春季学期
C语言课程设计
专 业: 电子信息科学与技术 日 期: 2011年6月10日
哈尔滨工业大学
2011年5月
C语言课程设计(报告) 2011
链表的综合操作
1. 引言
链表是一种最常见的数据结构,它是动态地进行存储分配的一种结构[1]。所谓动态链表是指链表结构可以是动态地分配存储的,即在需要时才开辟结点的存储空间,实现动态链接。动态链表属于线性表,线性表的主要特点是:除了起始节点和终端节点外其余节点都仅有一个前驱节点和后继节点,起始节点没有前驱节点,终端节点没有后继节点。链表的链式存储是用一组任意的存储单元存放线性表中的数据元素。在链表中借用指针来表示数据元素间的逻辑关系。换句话说,链表中的数据元素对应的节点包括两个域:指针域和数据域。如果每个节点仅包含一个指向其后继元素的指针, 那么我们称此类节点构成的是单链表。本文通过建立、查找、输出、删除学生信息为例,介绍的单链表的基本操作:单链表的建立,查找和删除某些节点。
2.系统需求分析
2.1 系统需求分析
系统需求:
1、建立一个链表,每个节点包括:学号、姓名、成绩,建立链表用函数实现; 2、输入一个学号,检索该学生的有关信息,检索用函数实现; 3、从链表中删除成绩低于50分的学生,删除节点用函数实现。
分析:对于需求1,需一个一个地开辟节点和输入个节点数据信息,并建立起前后相链的关系。对需求2,由于在单链表中,每个节点的存储位置都放在前一节点的next域中,在查找时只能从链表的头指针出发,顺着指针域next逐个节点往下搜索,直至搜索到需要的节点位置。对于需求3,是把要删除的节点原来的链接关系撤销,从而将它从链表中分离开来。
3.系统总体设计
2.1功能模块设计
模块1:
制作链表; 模块2:
检索学生的有关信息; 模块3:
- 1 -
C语言课程设计(报告) 2011
删除成绩低于50分的学生; 模块4:
显示删除后的链表; 模块5:
释放链表中所有节点占用的内存。
2.2程序处理流程
1.先确定录入信息的学生人数,然后依次从键盘键入,并建立起链表。 2.输入要检索学生的学号,并打印出该学生信息。 3.删除
a.询问是否删除,要删除输入Y或y,不删除输入N或n; b.自动删除低于50分学生的信息。
4.打印删除后学生信息。
2.3开发工具
C-free
4.系统详细设计与实现
4.1预处理
#include
4.2数据结构定义
struct Link {
long num; /*学号*/ char name[20]; /*姓名*/ int score; /*成绩*/ struct Link *next; };
2.函数及变量声明
a.变量声明
int b; char a;
struct man *p,*p1;
b.函数声明
输入:struct man *get()
查找:void find(struct man *p1)
删除:struct man*loss(struct man *head)
- 2 -
C语言课程设计(报告) 2011
4.3函数及变量声明
a.函数声明
/*制作链表*/
struct Link *AppendNode(struct Link *head); /*检索学生的有关信息*/ void DispLink(struct Link *head); /*删除成绩低于50分的学生*/ struct Link *DelNode(struct Link *head); /*显示删除后的链表*/ void Print(struct Link *head); /*释放链表中所有节点占用的内存*/ void DeleteMemory(struct Link *head); b.变量声明
int k, n; char s;
struct Link *head=NULL;
4.4主函数、主要处理函数、辅助函数的设计
a.主函数源代码
main() {
int k, n; char s;
struct Link *head=NULL;
printf(\输入学生人数:\ scanf(\ printf(\ k = 1;
while(k <= n) {
head=AppendNode(head); k ++; }
printf(\ DispLink(head); printf(\
- 3 -
C语言课程设计(报告) 2011
printf(\是否要删除成绩低于50分一下学生的信息:\ scanf(\
printf(\
if(s == 'N' || s == 'n') {
printf(\未删除时学生的信息:\\n\ Print(head); }
else if(s == 'Y' || s == 'y') {
head = DelNode(head);
printf(\删除后学生的信息:\\n\ Print(head); }
DeleteMemory(head); }
b.主要处理函数源代码
/*制作链表*/
struct Link *AppendNode(struct Link *head) {
struct Link *p = NULL; struct Link *pr = head;
p = (struct Link *)malloc(sizeof(struct Link)); if(p == NULL) {
printf(\ exit(0); }
if(head == NULL) {
head = p; } else {
while(pr->next != NULL) {
pr = pr->next; }
pr->next = p; }
pr = p;
printf(\学号 姓名 分数:\
- 4 -