1、3数据结构实验3链表实 验 报 告院(系):信息科学与技术学院 课程名称:数据结构 日期:班级信A1321学号11314030119实验室专业信息管理与信息系统姓名黄伟峰计算机号实验名称实验三 线性链表的运算成绩评定所用软件V C或TC教师签名实验目的1.掌握线性链表的基本概念2.掌握线性链表的建立、插入和删除等方法。3.掌握线性链表的基本算法。实验准备1.复习书上有关内容。2.阅读实验内容1,进行程序填空,并编制相应的主函数。3.编出实验内容的源程序。实验总结一、程序填空:#include #include typedef char elemtype;typedef struct node
2、elemtype data; struct node *next;node,*linklist;/建立链表linklist createlistf() char ch; linklist head; node *p; head=(linklist)malloc(sizeof(node);/建立新节点 head-next=NULL; ch=getchar(); while (ch!=$) p=(node*)malloc(sizeof(node);/建立新的节点 p-data=ch; p-next=head-next;/将head插入头结点 head-next=p; ch=getchar(); r
3、eturn(head); /在链表的p指定节点后插入值为x的节点int link(node *p,char x) node *s;/定义指向节点的指针 s=(node*)malloc(sizeof(node); s-data=x;/将值插入s数据域中 s-next=p-next; p-next=s; return 1;/删除指点节点后的节点void DelLinkList(node *p) node*q; if (p-next!=0) q=p-next;/q指向p的后续节点 p-next=q-next;/修改p节点的指针域 free(q);/释放q /在链表中查找指定的节点node *lbcz
4、(node *h,elemtype x) node *p; p=h-next; while (p!=0 p-data!=x) p =p-next; return(p);/链表的输出void printlink(node *h) node *p; p=h-next; printf(n); while (p!=0) printf(%c,p-data); p=p-next; printf(n);void main() char x; int m; char y; node *a; node *b; printf(输入值以$结束:n); a=createlistf(); printlink(a); p
5、rintf(输入要查找的节点:n); getchar(); scanf(%c,&x); b=lbcz(a,x); printlink(a); DelLinkList(b); printlink(a); printf(输入要插入的值:n); getchar(); scanf(%c,&y); m=link(b,y); if (m) printf(插入成功!); printlink(a); else printf(插入失败!);二、源代码以及输入数据输出结果为:/单链表中输入数据个数为10个,依次是1,3,5,7,12,45,67,89,92,99。#include #include #includ
6、e typedef struct Node int data;/数据域 struct Node *pNext;/指针域NODE,*PNODE;/函数声明PNODE create_list(void);void treaverse_list(PNODE PHead);PNODE Locate(PNODE pHead,int e);/查找节点int link(PNODE p,int e);/插入函数int main(void) int e=25; PNODE pHead=NULL;/等价于struct Node *Phead=NULL; PNODE p; pHead=create_list();/
7、create_list()/功能:创建一个非循环链表,并将该量表的空间给pHead treaverse_list(pHead); p=Locate(pHead,e); treaverse_list(p); link(p,e); treaverse_list(pHead); return 0;PNODE create_list(void) int val; int len;/用于存放节点的有效个数 int i; PNODE pHead=(PNODE)malloc(sizeof(Node); if (NULL=pHead) printf(分配失败,程序终止:n); exit(-1); PNODE
8、PTail=pHead; PTail-pNext=NULL; printf(请输入要生成的链表数据个数:len=); scanf(%d,&len); for (i=0;idata=val; PTail-pNext=pNew; pNew-pNext=NULL; PTail=pNew; return pHead;void treaverse_list(PNODE PHead) PNODE p=PHead-pNext; while (p!=NULL) printf(%5d,p-data); p=p-pNext; printf(n);PNODE Locate(PNODE pHead,int e)/查找
9、节点 PNODE p=pHead-pNext; /PNODE q=(PNODE)malloc(sizeof(Node); while(p!=NULL) if (p-pNext-datapNext; p=p-pNext; else break; return p; int link(PNODE pHead,int e)/插入 PNODE p=pHead; PNODE q=(PNODE)malloc(sizeof(Node); q-data=e;/将值插入s数据域中 q-pNext=p-pNext; p-pNext=q; return 1;三、源代码以及实验结果为#include#includet
10、ypedef char elemtype;typedef struct node elemtype data; struct node *next;NODE,*PNODE;PNODE chuanjiang()/创建函数 char ch; PNODE head; NODE *p; printf(头插法建立链表n); printf(请输入字符串,以回车键结束:); head=(PNODE )malloc(sizeof(NODE); head-next=0; ch=getchar(); while(ch!=n) p=(NODE *)malloc(sizeof(NODE); p-data=ch; p-
11、next=head-next; head-next=p; ch=getchar(); return (head);void plink(NODE *h)/输出NODE *p;p=h-next;printf(n);while (p!=NULL) printf(%c,p-data); p=p-next; printf(n);void shanchu(PNODE H) /删除NODE *p,*q,*r; p=H-next; while (p!=NULL) q=p; while (q-next!=NULL) if (q-next-data=p-data) r=q-next; q-next=r-next
12、; free(r); else q=q-next; p=p-next; void main() NODE *h; h=chuanjiang(); printf(创建的链表是:n); plink(h); printf(删除链表中相同的值:n); shanchu(h); printf(删除后链表的值:n); plink(h);四、源代码以及实验结果为/单链表中输入数据个数为10个,依次是1,3,5,7,12,45,67,89,92,99。#include #include #include typedef struct Node int data;/数据域 struct Node *pNext;/
13、指针域NODE,*PNODE;/函数声明PNODE create_list(void);void treaverse_list(PNODE PHead);/链接函数PNODE twoLinkList(PNODE A,PNODE B);int main(void) PNODE A=NULL;/等价于struct Node *Phead=NULL; PNODE B=NULL; PNODE C=NULL; A=create_list();/create_list()/功能:创建一个非循环链表,并将该量表的空间给pHead B=create_list(); treaverse_list(A); tre
14、averse_list(B); C=twoLinkList(A,B); treaverse_list(C); return 0;PNODE create_list(void) int val; int len;/用于存放节点的有效个数 int i; PNODE pHead=(PNODE)malloc(sizeof(Node); if (NULL=pHead) printf(分配失败,程序终止:n); exit(-1); PNODE PTail=pHead; PTail-pNext=NULL; printf(请输入要生成的链表数据个数:len=); scanf(%d,&len); for (i=
15、0;idata=val; PTail-pNext=pNew; pNew-pNext=NULL; PTail=pNew; return pHead;void treaverse_list(PNODE PHead) PNODE p=PHead-pNext; while (p!=NULL) printf(%5d,p-data); p=p-pNext; printf(n);PNODE twoLinkList(PNODE A,PNODE B)/合并链表 PNODE pa=A-pNext; PNODE pb=B-pNext; PNODE pc; PNODE Lc; Lc=A; Lc-pNext=NULL;
16、 pc=Lc; while(pa & pb) if(pa-datadata) pc-pNext=pa; pc=pa; pa=pa-pNext; else pc-pNext=pb; pc=pb; pb=pb-pNext; pc-pNext=pa?pa:pb; free(B); return(Lc);五、源代码以及实验结果为#include#includetypedef char elemtype;typedef struct node elemtype data; struct node *next;NODE,*PNODE;PNODE chuanjiang()char ch;PNODE head
17、;NODE *p;head=(PNODE )malloc(sizeof(NODE);head-next=head; ch=getchar();while(ch!=n) p=(NODE *)malloc(sizeof(NODE);p-data=ch;p-next=head-next;head-next=p;ch=getchar();return(head);void plink(NODE *h)/单链表的输出 NODE *p; p=h-next; while(p!=NULL) printf(%c,p-data); p=p-next; printf(n);void pooiplink(PNODE
18、h)/循环链表的输出 NODE *p; p=h-next; while(p!=h) printf(%c,p-data); p=p-next; printf(n);void chaifen(PNODE h,PNODE *a,PNODE *b)NODE *ar,*br,*p; if(h-next=h) return ; (*a)=(PNODE )malloc(sizeof(NODE); (*a)-next=*a; ar=*a; (*b)=(PNODE )malloc(sizeof(NODE); (*b)-next=*a; br=*b; p=h-next; while(p!=h) if(p-data=0 & p-datanext=p;ar=ar-next; else br-next=p;br=br-next; p=p-next; ar-next=*a; br-next=*b;void main() NODE *a;PNODE b,c;a=chuanjiang();printf( 建立的循环单链表 :);plink(a);printf(n);chaifen(a,&b,&c);printf(拆分后的数字字符链表:);plink(b);printf(拆分后的字母字符链表:);plink(c);六、实验体会:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1