2014-2015学年第一学期《数据结构》课程设计报告题目:链表结构的相关函数库的设计专业:计算机科学与技术班级:12级计科(3)班:指导教师:成绩:计算机与信息工程系2014 年 12月 15 日目录1 问题分析和任务定义 (1)1.1 任务定义 (1)1.2 面临的问题,进行分析解决,模块之间的联系。
(1)2概要设计和数据结构的选择 (2)2.1 数据结构的选择 (2)2.2 结构图 (2)2.3 函数实现的具体算法举例 (3)3 课程设计思路 (6)3.1 设计函数库 (6)4 测试结果及其分析 (7)4.1 初始化 (7)4.2 逆序输入元素 (8)4.3 单链表的长度 (8)4.4 遍历输出单链表 (8)4.5检索查找 (9)4.6输入插入元素的值和位置 (9)4.7删除元素 (10)5 小结 (10)参考文献 (10)附录:程序源代码 (11)1 问题分析和任务定义1.1 任务定义设计出链表结构的相关函数库,以便在程序设计中调用。
进行链表中元素的输入、查找、插入、删除等操作的课程设计。
要求:(1)所设计的数据结构应尽可能节省存储空间。
(2)程序的运行时间应尽可能少。
从题目看出所设计的程序应能达到的功能,设计好的程序要满足以上两点。
在数据输入方面可以根据链表的特点即存储空间的连续,从创建链表到插入,删除,查找元素以及输出一系列的步骤,连贯而下。
算法的实现依赖于所采用的存储结构,所以选择什么样的存储方式在课程设计中尤为重要,这也是本程序好坏的一个评定。
1.2 面临的问题,进行分析解决,模块之间的联系。
(1)在存中开辟一块连续的存空间,进行分析解决(2)利用物理位置的相邻来表示变量,达到预期效果,很好的完成任务。
查找元素以及输出一系列的步骤,连贯而下。
(3)使用链表的数据结构来满足尽可能节省存储空间的要求,达到要求,从创建链表到插入,删除,查找元素以及输出一系列的步骤,连贯而下。
(4)输出界面设计与各个模块的联系,设计出链表结构的相关函数库,以便在程序设计中调用,进行链表中元素的分析。
2概要设计和数据结构的选择2.1 数据结构的选择本程序选择的数据结构是线性表中的链式结构(单链表),原因如下:单链表的定义:(1)单链表是线性表的存储表示。
其各个数据元素可以相继存储,也可以不相继存储,不过它为每个数据元素附加了一个指针,并形成的一个结点。
(2)单链表的每一个结点分为两个部分:data和link。
(3)链表的第一个结点的地址可以通过链表的头指针first找到,其他结点的地址则在前趋结点的link域中,链表的最后一个结点没有后继,在结点的link 域中放一个空指针NULL。
(4)头指针first为空的单链表为空表,该链表一个结点也没有,相对地,头指针first不为空且首元结点存在的单链表为非空表,表中至少有一个结点。
2.2 结构图图 1 结构图2.3 函数实现的具体算法举例(1)插入函数/* 在带头结点的单链线性表L中第i个位置之前插入元素e */int Insert_List(LinkList L,int i,ElemType e){int j=0;LinkList p=L,s;while(p&&j<i-1){p=p->next;j++;}if(!p||j>i-1)return ERROR;s=(LinkList)malloc(sizeof(struct LNode));s->data=e;s->next=p->next;p->next=s;return OK;}(2)删除函数int Delete_List(LinkList L,int i,ElemType *e) /* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */{int j=0;LinkList p=L,q;while(p->next&&j<i-1)p=p->next;j++;}if(!p->next||j>i-1)return 0;q=p->next;p->next=q->next;*e=q->data;free(q);return 1;}(3)查找元素/* 当按位置查找元素,第i个元素存在时,其值赋给e并返回1,否则返回0 */ int GetElem_List(LinkList L,int i,ElemType *e){int j=0;LinkList p=L;while(p&&j<i){p=p->next;j++;}if(!p||j>i){ printf("链表不存在或参数i错");return 0;}*e=p->data; /* 取第i个元素 */return 1;(5)显示单链表int Disp_List(LinkList L)/*显示单链表*/ {LinkList p=L->next;if(p==Null) printf("单链表为空表"); else{printf("输出单链表:\n");while(p!=Null){printf("%d",p->data);printf("->");p=p->next;}}printf("\n");return 1;}(6)求单链表表长int Length_List(LinkList L){int i=0;LinkList p=L->next;while(p){i++;p=p->next;}return i;3 课程设计思路一般的说,其过程如下:A. 分析链表特点B. 分析链表功能以及操作C. 设计函数库D. 制定调试计划:初步调试计划E. 编写主函数,方便后面的测试F. 制定完整的程序测试计划G. 书写文档,系统说明H. 复查和审核:从技术的角度审查,从管理的角度审查3.1 设计函数库设计函数库不能随心所欲,想编写什么函数就编写什么函数,而是要根据分析链表所得结果,从分析结果入手,由分析我们知道链表可以进行的操作有:输入、输出、插入一个元素、删除一个元素、查找一个元素、取出一个元素。
根据这些操作分别写出函数:int Insert_List(); /*插入元素*/int Delete_List(); /*删除元素*/int GetElem_List(); /*查找元素*/int Disp_List(); /*显示元素*/int Length_List(); /*求表长*/4 测试结果及其分析4.1 初始化图2 初始化4.2 逆序输入元素图3 逆序输入元素4.3 单链表的长度图4 计算长度4.4 遍历输出单链表图 5遍历4.5检索查找图 6查找4.6输入插入元素的值和位置图 7插入4.7删除元素图 8 插入5 小结通过这次课设,我学会了如何把数据结构的知识应用到实践当中,同时也进一步加深了对c/c++语言语法的应用,以及深刻的掌握了数据结构和c/c++语言的结合运用。
在编程过程中,遇到了许多问题,在一次次的运行错误后,问题被一步步改正,也从中学到了许多知识。
虽然我的程序还不够完善,还需加以改进以实现更多的功能,但是我会尽我最大的努力去完成它,我相信我会努力去把程序做的更加完美。
参考文献[1]王昆仑,红等编著. 数据结构与算法. 北京:中国铁道,2007.[2]苏仕华等编著. 数据结构课程设计. 北京:机械工业 ,2005.[3]苏仕华编著. 数据结构与算法解析.:中国科学技术大学,2004.[4]郭嵩山等著国际大学生程序设计竞赛例题解北京:电子工业,2008.附录:程序源代码#include<stdlib.h>#include<stdio.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define Null 0typedef int ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode ,*LinkList;/*初始化单链表,即产生一个带头结点的空表,创建成功则返回空表的头指针*/ LinkList Init_List(void){LinkList L;L=(LinkList) malloc(sizeof(LNode));if(L)L->next=NULL; //产生空表,头结点的next域为空return L;}/*按逆序产生一个长度为n链表,参数为初始化的空链表,及线性表长度n*/ /*每个元素依次插入在头结点后*/int Create_List(LinkList L,int n){int i;LinkList s; /*s变量用于保存新结点地址*/printf("生成有%d个元素的线性表:\n",n);for(i=n;i>0;i--){ printf("请输入线性表中第 %d 个元素:\n",i); /*逆序输入元素*/ s=(LinkList)malloc(sizeof(LNode));if(!s){printf("创建结点不成功\n");return 0;}scanf("%d",&s->data);s->next=L->next;L->next=s;}return 1;}/* 求单链表表长,返回L中数据元素个数 */int Length_List(LinkList L){int i=0;LinkList p=L->next;while(p){i++;p=p->next;}return i;}/* 当按位置查找元素,第i个元素存在时,其值赋给e并返回1,否则返回0 */ int GetElem_List(LinkList L,int i,ElemType *e){int j=0;LinkList p=L;while(p&&j<i){p=p->next;j++;}if(!p||j>i){ printf("链表不存在或参数i错");return 0;}*e=p->data; /* 取第i个元素 */return 1;}/* 按元素查找,查找链表中是否存在值为e的元素,存在,则返回L中第一个e元素的位序,若不存在,则返回值为0 */int Locate_List(LinkList L,ElemType e){int i=0;LinkList p=L;while(p&&p->data!=e){ p=p->next;i++;}if(p)return i;elsereturn 0;}/* 在带头结点的单链线性表L中第i个位置之前插入元素e */int Insert_List(LinkList L,int i,ElemType e){int j=0;LinkList p=L,s;while(p&&j<i-1){p=p->next;j++;}if(!p||j>i-1)return ERROR;s=(LinkList)malloc(sizeof(struct LNode));s->data=e;s->next=p->next;p->next=s;return OK;}int Delete_List(LinkList L,int i,ElemType *e) /* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */{int j=0;LinkList p=L,q;while(p->next&&j<i-1){p=p->next;j++;}if(!p->next||j>i-1)return 0;q=p->next;p->next=q->next;*e=q->data;free(q);return 1;}int Disp_List(LinkList L)/*显示单链表*/ {LinkList p=L->next;if(p==Null) printf("单链表为空表");else{printf("输出单链表:\n");while(p!=Null){printf("%d",p->data);printf("->");p=p->next;}}printf("\n");return 1;}/*显示选择提示信息函数*/void ShowSelect(){ printf("\n请选择要执行的操作:\n");printf("-------------------------\n");printf(" 1----初始化\n");printf(" 2----逆序输入元素\n");printf(" 3----求单链表长度\n");printf(" 4----遍历输出单链表\n");printf(" 5----在单链表中检索查找\n");printf(" 6----向单链表中插入元素\n");printf(" 7----从单链表中删除元素\n");printf(" 0---- 退出\n");printf("-------------------------\n");printf("please input number 0~~7 \n\n");}int main(void){LinkList PL=NULL;int i,x,flag;int len; /*表示单链表长*/int select; /*select变量表示用户的选择项*/ShowSelect();scanf("%d",&select);while(select!=0){switch(select){case 1: PL=Init_List(); break;case 2: printf("请输入线性表中元素个数:\n");scanf("%d",&len);Create_List(PL,len);break;case 3: len=Length_List(PL); printf("单链表表长为%d\n",len);break; case 4: Disp_List(PL);break;case 5: printf("\n请输入你想查找的数据:");scanf("%d",&x);i= Locate_List(PL, x);if(flag)printf("该元素在顺序表中的位置是:%d\n",i) ;elseprintf("该元素在顺序表中不存在");break;case 6: printf("请输入要插入的元素的值和位置,用空格分隔:\n"); scanf("%d %d",&x,&i);flag=Insert_List(PL,i,x);if(flag) printf("插入操作成功");break;case 7: printf("请输入要删除的元素的位置:\n");scanf("%d",&i);flag= Delete_List(PL,i,&x);if(flag) printf("删除操作成功");break;}ShowSelect();scanf("%d",&select);}}。