C语言设计 链表的综合操作

更新时间:2024-06-02 08:25:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

哈尔滨工业大学 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 #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 -

C语言课程设计(报告) 2011

scanf(\ pr->next = NULL; return head; }

/*检索学生的有关信息*/

void DispLink(struct Link *head) {

struct Link *p = head; long n; int flag=1;

printf(\输入要检索的学生学号:\ scanf(\

while(flag == 1 && p != NULL) {

if(n == p->num) {

flag = 0; break; }

p = p->next; }

if(flag == 0) {

printf(\ } else {

printf(\ } }

/*删除成绩低于50分的学生*/

struct Link *DelNode(struct Link *head) {

struct Link *p = head, *pr = head, *prr = head;

if(head == NULL) {

printf(\ return (head); }

- 5 -

C语言课程设计(报告) 2011

pr = p;

while(p != NULL) {

if(p->score<50) {

if(p == head) {

head = p->next; } else {

pr->next = p->next; }

p = p->next; } else {

pr = p;

p = p->next; } }

return head; }

/*显示删除后的链表*/

void Print(struct Link *head) {

struct Link *p = head;

while(p != NULL) {

printf(\ p = p->next; } }

c.辅助函数源代码

/*释放链表中所有节点占用的内存*/

void DeleteMemory(struct Link *head) {

struct Link *p = head,*pr = NULL; while(p != NULL) {

pr = p;

- 6 -

C语言课程设计(报告) 2011

p = p->next; free(pr); } }

4.5系统实现(截图)

图1 程序运行情况

5 结术语

通过这次链表操作在理解链表原理的基础上,利用计算机进行程序的上机调试,并附以图示,不仅加深我们的链表的理解,更能提高我们对C语言学习兴趣和效率,使我们在整个学习过程中始终保持良好的学习情绪和活跃的思维。

参 考 文 献

[1] 苏小红, 陈惠鹏, 孙志岗. C语言大学实用教程(第2版).电子工业出版社. 2007 [2] 谭浩强. C程序设计.清华大学出版社. 2005.

- 7 -

本文来源:https://www.bwwdw.com/article/zwl6.html

Top