1、数据结构实验3王清华0907022107数据结构实验报告实验序号:3 实验项目名称:链式表的操作学号0907022107姓名王青华专业、班11网络工程实验地点1#316指导教师林仙丽实验时间一、实验目的及要求1. 通过实验理解单链表的逻辑结构;2. 通过实验掌握单链表的基本操作和具体的函数实现。二、实验设备(环境)及要求微型计算机;windows 操作系统;Microsoft Visual Studio 6.0集成开发环境。三、实验内容与步骤1.链式表表示和实现线性表的如下:#includestdio.h#includestring.h#includestdlib.h#includectype
2、.htypedef struct node /定义结点 char data10; /结点的数据域为字符串 struct node *next; /结点的指针域 ListNode;typedef ListNode * LinkList; / 自定义LinkList单链表类型LinkList CreatListR1(); /函数,用尾插入法建立带头结点的单链表ListNode *LocateNode(LinkList head, char *key); /函数,按值查找结点void DeleteList(LinkList head,char *key); /函数,删除指定值的结点void prin
3、tlist(LinkList head); /函数,打印链表中的所有值void DeleteAll(LinkList head); /函数,删除所有结点,释放内存/=主函数=void main() char *ch,*num; num=new char; ch=new char10; LinkList head; head=CreatListR1(); /用尾插入法建立单链表,返回头指针 printlist(head); /遍历链表输出其值 printf( Delete node (y/n):); /输入y或n去选择是否删除结点 scanf(%s,num); if(strcmp(num,y)=
4、0 | strcmp(num,Y)=0) printf(Please input Delete_data:); scanf(%s,ch); /输入要删除的字符串 DeleteList(head,ch); printlist(head); DeleteAll(head); /删除所有结点,释放内存/=用尾插入法建立带头结点的单链表= LinkList CreatListR1(void) char *ch; ch=new char10; LinkList head=(LinkList)malloc(sizeof(ListNode); /生成头结点 ListNode *s,*r,*pp; r=hea
5、d; r-next=NULL; printf(Input # to end ); /输入#代表输入结束 printf(Please input Node_data:); scanf(%s,ch); /输入各结点的字符串 while(strcmp(ch,#)!=0) 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 he
6、ad; /返回头指针/=按值查找结点,找到则返回该结点的位置,否则返回NULL=ListNode *LocateNode(LinkList head, char *key) ListNode *p=head-next; /从开始结点比较 while(strcmp(p-data,key)!=0 & p) /直到p为NULL或p- data为key止 p=p-next; /扫描下一个结点 return p; /若p=NULL则查找失败,否则p指向找到的值为key的结点/=删除带头结点的单链表中的指定结点=void DeleteList(LinkList head,char *key) ListNo
7、de *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=head-next; /从开始结点打印 while(p) printf(%s, ,p-data); p=p-ne
8、xt; printf(n);/=删除所有结点,释放空间=void DeleteAll(LinkList head) ListNode *p=head,*r; while(p-next) r=p-next; free(p); p=r; free(p); 改写以上程序,实现功能如下:1.编写一个函数计算值域为x的结点个数。运行结果截图:2.编写一个删除链表中值为x的结点的直接前趋结点的算法,若有多个值为x的结点,则删除第一个x的直接前趋结点。运行结果截图:3.写一个对单循环链表进行逆序遍历(打印每个结点的值)的算法。运行结果截图:4改写CreatListR1函数,使得链表创建时为非降序排列,在上述
9、链表中插入一个元素,使得链表依然升序;运行结果截图:四、实验结果与数据处理详细记录程序在调试过程中出现的问题及解决方法。记录程序执行的结果(贴图)。五、分析与讨论对上机实践结果进行分析,上机的心得体会。六、教师评语签名:日期:成绩附源程序清单:1. #include stdio.h#include stdlib.htypedef struct ListNode int data; struct ListNode *next;ListNode,*LinkList; void InsertListNum(LinkList H) ListNode *p,*q; int i; char ch = NU
10、LL; p = H; while(ch != n) q =(LinkList)malloc(sizeof(ListNode); scanf(%d,&i); q-data = i; q-next = p-next; p-next = q; q = q-next; ch = getchar(); int CountListSameNum(LinkList H,int x) ListNode *p; int count=0; p = H-next; while(p) if(p-data = x) count+; p = p-next; return count;void PrintList(Link
11、List H) ListNode *p; p = H-next; while(p) printf(%d ,p-data); p=p-next; printf(n); main() int n,x; LinkList H; H =(LinkList *)malloc(sizeof(ListNode); InsertListNum(H); PrintList(H); printf(Enter the Number you count:n); scanf(%d,&x); n = CountListSameNum(H,x); printf(n=%d ,n);2.#include stdio.h#inc
12、lude stdlib.htypedef struct ListNode int data; struct ListNode *next;ListNode,*LinkList; void InsertListNum(LinkList H) ListNode *p,*q; int i; char ch; p = H; printf(Enter the numbers:n); while(ch != n) q =(LinkList)malloc(sizeof(ListNode); scanf(%d,&i); q-data = i; q-next = p-next; p-next = q; q =
13、q-next; ch = getchar(); int CountListSameNum(LinkList H,int x) ListNode *p; int count=0; p = H-next; while(p) if(p-data = x) count+; p = p-next; return count;void DeleteListNum(LinkList H,int x) ListNode *p,*r; int n; p = H; n = CountListSameNum(H,x); if(n=0) printf(No founding!); else while(p) if(p
14、-data = x) r=p-next; p-next=r-next; free(r); break;/若将break去点,则可以删除所有的值为x的前驱结点 p = p-next; while(p-next = NULL) printf(nThis NO.1,No Head!n); break; void PrintList(LinkList H) ListNode *p; p = H-next; while(p) printf(%d ,p-data); p=p-next; printf(n); main() int n,x1,x2; LinkList H;H =(LinkList *)mal
15、loc(sizeof(ListNode); InsertListNum(H); PrintList(H); printf(Enter the Number you count:n); scanf(%d,&x1); n = CountListSameNum(H,x1); printf(n=%d ,n); printf(n); printf(Enter the number you delete:n); scanf(%d,&x2); DeleteListNum(H,x2); PrintList(H);3.#include stdio.h#include stdlib.htypedef struct
16、 ListNode int data; struct ListNode *next;ListNode,*LinkList; void InsertListNum(LinkList H) ListNode *p,*q; int i=0; char ch = NULL; p = H; printf(Enter the numbers:n); while(ch != n) q =(LinkList *)malloc(sizeof(ListNode); scanf(%d,&i); q-data = i; q-next = p-next; p-next = q; p = p-next; ch = get
17、char(); void SortListNum(LinkList H) ListNode *p,*q; p = H-next; H-next = NULL; while(p) q = p; p = p-next; q-next = H-next; H-next = q; void PrintList(LinkList H) ListNode *p; p = H; printf(The new Linklist is:n); p = p-next; while(p) printf(%d ,p-data); p=p-next; printf(n);main() LinkList H; H =(L
18、inkList *)malloc(sizeof(ListNode); InsertListNum(H); PrintList(H); SortListNum(H); PrintList(H);4.#include stdio.h#include stdlib.htypedef struct ListNode int data; struct ListNode *next;ListNode,*LinkList; void InsertListNum(LinkList H) ListNode *p,*q; int i; char ch; p = H; printf(Enter the number
19、s:n); while(ch != n) q =(LinkList)malloc(sizeof(ListNode); scanf(%d,&i); q-data = i; q-next = p-next; p-next = q; q = q-next; ch = getchar(); void PrintList(LinkList H) ListNode *p; p = H-next; while(p) printf(%d ,p-data); p=p-next; printf(n); int CountAllListNum(LinkList H) ListNode *p; int i = 0;
20、p = H-next; while(p) p = p-next; i+; return i;void SortListNum(LinkList H) ListNode *p,*s,*pt; p = H; s = p-next; while(p-next != NULL) while(s-next != NULL) if(p-next-data s-next-data) pt = p-next; p-next = s-next; s-next = p-next-next; p-next-next = pt; else s = s-next; p = p-next; s = p-next; voi
21、d InsertANum(LinkList H,int x) ListNode *p,*q; p = (ListNode *)malloc(sizeof(ListNode); p-data = x; p-next = NULL; q = H; while(q-next !=NULL) if(q-next-data = x) p-next = q-next; q-next = p; break; q = q-next; while(q-next = NULL) q-next = p; main() int m,n; LinkList H; H =(LinkList)malloc(sizeof(ListNode); InsertListNum(H); PrintList(H); n = CountAllListNum(H); printf(%dn,n); SortListNum(H); PrintList(H); printf(Enter the num :n); scanf(%d,&m); InsertANum(H,m); PrintList(H);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1