1、数据结构C语言版实验报告doc数据结构 (C 语言版 ) 实验报告学院 计算机科学与技术专业 *学号 *班级 *指导教师 *实验 1实验题目 :单链表的插入和删除实验目的 :了解和掌握线性表的逻辑结构和链式存储结构, 掌握单链表的基本算法及相关的时间性能分析。实验要求:建立一个数据域定义为字符串的单链表, 在链表中不允许有重复的字符串; 根据输入的字符串,先找到相应的结点,后删除之。实验主要步骤:1、分析、理解给出的示例程序。2、调试程序,并设计输入数据(如: bat,cat,eat, fat, hat,jat , lat, mat, #),测试程序的如下功能:不允许重复字符串的插入;根据输入
2、的字符串,找到相应的结点并删除。3、修改程序:(1) 增加插入结点的功能。(2) 将建立链表的方法改为头插入法。程序代码 :#includestdio.h#includestring.h#includestdlib.h#includectype.htypedef struct node/定义结点char data10;/ 结点的数据域为字符串struct node *next;/ 结点的指针域ListNode;typedef ListNode * LinkList; LinkList CreatListR1();/ 自定义 LinkList 单链表类型/ 函数,用尾插入法建立带头结点的单链表L
3、inkList CreatList(void);ListNode *LocateNode();/函数,用头插入法建立带头结点的单链表/ 函数,按值查找结点void DeleteList();/ 函数,删除指定值的结点void printlist();void DeleteAll();/函数,打印链表中的所有值/函数,删除所有结点,释放存ListNode * AddNode();/ 修改程序:增加节点。用头插法,返回头指针/= 主函数 =void main()/ 输入各结点的字符串char ch10,num5;LinkList head;head=CreatList();printlist(he
4、ad);printf( Delete node (y/n):);scanf(%s,num);/ 用头插入法建立单链表,返回头指针/ 遍历链表输出其值/ 输入 y 或 n 去选择是否删除结点if(strcmp(num,y)=0 | strcmp(num,Y)=0)printf(Please input Delete_data:);scanf(%s,ch); /输入要删除的字符串DeleteList(head,ch);printlist(head);printf( Add node ? (y/n):); /输入 y 或 n 去选择是否增加结点 scanf(%s,num);if(strcmp(num
5、,y)=0 | strcmp(num,Y)=0)head=AddNode(head);printlist(head);DeleteAll(head); / 删除所有结点,释放存/= 用尾插入法建立带头结点的单链表 =LinkList CreatListR1(void)char ch10;LinkList head=(LinkList)malloc(sizeof(ListNode); /ListNode *s,*r,*pp;r=head;r-next=NULL;printf(Input # to end ); /输入 # 代表输入结束生成头结点printf(nPlease input Node_
6、data:);scanf(%s,ch);while(strcmp(ch,#)!=0) pp=LocateNode(head,ch);/ 按值查找结点,返回结点指针if(pp=NULL) /没有重复的字符串,插入到链表中s=(ListNode *)malloc(sizeof(ListNode);strcpy(s-data,ch);r-next=s;r=s;r-next=NULL;printf(Input # to end );printf(Please input Node_data:);scanf(%s,ch);return head;/返回头指针/= 用头插入法建立带头结点的单链表 =Lin
7、kList CreatList(void)char ch100;LinkList head,p;head=(LinkList)malloc(sizeof(ListNode);head-next=NULL;while(1)printf(Input # to end );printf(Please input Node_data:);scanf(%s,ch);if(strcmp(ch,#)if(LocateNode(head,ch)=NULL)strcpy(head-data,ch);p=(LinkList)malloc(sizeof(ListNode);p-next=head;head=p;el
8、sebreak;return head;/= 按值查找结点,找到则返回该结点的位置,否则返回 ListNode *LocateNode(LinkList head, char *key) NULL=ListNode *p=head-next; / 从开始结点比较while(p!=NULL & strcmp(p-data,key)!=0)p=p-next; /扫描下一个结点return p; /若 p=NULL 则查找失败,否则/ 直到 p 为 NULLp 指向找到的值为或 p-data 为 key 的结点key 止/ 输入各结点的字符串/= 修改程序:增加节点 =ListNode * AddN
9、ode(LinkList head)char ch10;ListNode *s,*pp;printf(nPlease input a New Node_data:);scanf(%s,ch);pp=LocateNode(head,ch); / 按值查找结点,返回结点指针 printf(ok2n);if(pp=NULL) /没有重复的字符串,插入到链表中s=(ListNode *)malloc(sizeof(ListNode);strcpy(s-data,ch);printf(ok3n);s-next=head-next;head-next=s;return head;/= 删除带头结点的单链表
10、中的指定结点 =void DeleteList(LinkList head,char *key)ListNode *p,*r,*q=head;p=LocateNode(head,key); / 按 key 值查找结点的if(p=NULL ) / 若没有找到结点,退出printf(position error);exit(0);while(q-next!=p) /p 为要删除的结点, q 为 p 的前结点q=q-next;r=q-next;q-next=r-next;free(r); / 释放结点/= 打印链表 =void printlist(LinkList head)ListNode *p=
11、head-next; / 从开始结点打印while(p)printf(%s, ,p-data);p=p-next;printf(n);/= 删除所有结点,释放空间 =void DeleteAll(LinkList head)ListNode *p=head,*r;while(p-next)r=p-next;free(p);p=r;free(p);实验结果:Input # to end Please input Node_data:batInput # to end Please input Node_data:catInput # to end Please input Node_data:e
12、atInput # to end Please input Node_data:fatInput # to end Please input Node_data:hatInput # to end Please input Node_data:jatInput # to end Please input Node_data:latInput # to end Please input Node_data:matInput # to end Please input Node_data:#mat, lat, jat, hat, fat, eat, cat, bat,Delete node (y/
13、n):yPlease input Delete_data:hatmat, lat, jat, fat, eat, cat, bat,Insert node (y/n):yPlease input Insert_data:putposition :5mat, lat, jat, fat, eat, put, cat, bat,请按任意键继续 . . .示意图:headmat lat jat hat fat eat cat batNULLheadmat lat jat fat eat cat batNULLhatheadmat lat jat fat eat cat batNULLput心得体会:本次实验使我们对链表的实质了解更加明确了, 对链表的一些基本操作也更
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1