C语言链表实验报告

合集下载

链表实验报告

链表实验报告

C 语言程序设计实验报告实验一:链表的基本操作一·实验目的1. 掌握链表的建立方法2. 掌握链表中节点的查找与删除3. 掌握输出链表节点的方法4. 掌握链表节点排序的一种方法5. 掌握C 语言创建菜单的方法6. 掌握结构化程序设计的方法二·实验环境1. 硬件环境:当前所有电脑硬件环境均支持2. 软件环境:Visual C++6.0三.函数功能1. CreateList // 声明创建链表函数2.TraverseList // 声明遍历链表函数3. InsertList // 声明链表插入函数4.DeleteTheList // 声明删除整个链表函数5. FindList // 声明链表查询函数 四.程序流程图五.程序代码#include<stdio.h>#include<stdlib.h>typedef int Elemtype;typedef int Status;typedef struct node//定义存储节点{int data;//数据域struct node *next;//结构体指针} *linklist,node;//结构体变量,结构体名称linklist creat (int n)//创建单链表{linklist head,r,p;//定义头指针r,p,指针int x,i;head=(node *)malloc(sizeof(node));//生成头结点 声明函数 主函数 main 创建链表函数定义CreateList 定义链表遍历函数TraverseList定义链表查询函数FindList 定义链表插入函数在链表位置第pos 节点前插入包含数据val 的节点InsertList(PNode List, int pos, int val) 插入节点 定义删除整个链表函数 DeleteTheList定义删除链表元素函数删除链表中的第pos 节点DeleteList(PNode List, int pos) 删除节点r=head;//r指向头结点printf("输入数字:\n");for(i=n;i>0;i--)//for 循环用于生成第一个节点并读入数据{scanf("%d",&x);p=(node *)malloc(sizeof(node));p->data=x;//读入第一个节点的数据r->next=p;//把第一个节点连在头结点的后面r=p;//循环以便于生成第二个节点}r->next=0;//生成链表后的断开符return head;//返回头指针}void output (linklist head)//输出链表{linklist p;p=head->next;do{printf("%3d",p->data);p=p->next;}while(p);printf("\n")}Status insert ( linklist &l,int i, Elemtype e)//插入操作{int j=0;linklist p=l,s;while(j<i-1 && p){p=p->next;++j;}if(!p || j>i-1)return -1;else{s=(node *)malloc(sizeof(node));s->data=e;s->next=p->next;p->next=s;return 1;}}Status delect ( linklist &l,int i, Elemtype &e)//删除操作{int j=0;linklist p=l,q;while(j<i-1 && p->next){p=p->next;++j;}if(!p->next || j>i-1)return -1;else{q=p->next;p->next=q->next;e=q->data;free(q);return 1;}}void combine(linklist la,linklist lb)//合并单链表{node *pa,*pb,*pc;linklist lc;pa=la->next;pb=lb->next;lc=pc=la;while(pa && pb){if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else{pc->next=pb;pc=pb;pb=pb->next;} }pc->next=pa?pa:pb;free(lb);}Status GetElem(linklist l,int i,Elemtype &e )//查找操作 {linklist p;int j;p=l->next;j=1;while(p && j<i){p=p->next;++j;}if(!p || j>i)return -2;e=p->data;return e;}void main(){linklist la,lb;int n;int i,j;Elemtype e;printf("请输入第一个链表:\n");printf("输入链表元素的个数:\n");scanf("%d",&n);la=creat(n);printf("输出链表:\n");output(la);printf("请输入要查找元素的位置:\n");scanf("%d",&i);j=GetElem(la,i,e);printf("所要查找的元素是%d\n",j);printf("请输入插入位置和元素:\n");scanf("%d%d",&i,&e);insert(la,i,e);printf("插入后的链表:\n");output(la);printf("请输入要删除的位置:\n");scanf("%d",&i);delect(la,i,e);printf("删除的那个元素是:%d\n",e);printf("输出删除后的顺序表:\n");output(la);printf("请输入第一个非递减链表:\n");printf("输入链表元素的个数:\n");scanf("%d",&n);la=creat(n);printf("输出链表:\n");output(la);printf("请输入第二个非递减链表:\n");printf("输入链表元素的个数:\n");scanf("%d",&n);lb=creat(n);printf("输出链表:\n");output(lb);combine(la,lb);printf("输出合并后的链表:\n");output(la);六.运行结果七.心得体会通过本次实验我对链表有了更深的了解,对链表的插删操作、遍历、查找等基本上掌握了。

数据结构(C语言版)实验报告

数据结构(C语言版)实验报告

实验1实验题目:单链表的插入和删除实验目的:了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。

实验要求:建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。

实验主要步骤:1、分析、理解给出的示例程序。

2、调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。

3、修改程序:(1)增加插入结点的功能。

(2)将建立链表的方法改为头插入法。

程序代码:#include"stdio.h"#include"string.h"#include"stdlib.h"#include"ctype.h"typedef struct node //定义结点{char data[10]; //结点的数据域为字符串struct node *next; //结点的指针域}ListNode;typedef ListNode * LinkList; // 自定义LinkList单链表类型LinkList CreatListR1(); //函数,用尾插入法建立带头结点的单链表LinkList CreatList(void); //函数,用头插入法建立带头结点的单链表ListNode *LocateNode(); //函数,按值查找结点void DeleteList(); //函数,删除指定值的结点void printlist(); //函数,打印链表中的所有值void DeleteAll(); //函数,删除所有结点,释放内存ListNode * AddNode(); //修改程序:增加节点。

用头插法,返回头指针//==========主函数==============void main(){char ch[10],num[5];LinkList head;head=CreatList(); //用头插入法建立单链表,返回头指针printlist(head); //遍历链表输出其值printf(" Delete node (y/n):"); //输入"y"或"n"去选择是否删除结点scanf("%s",num);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,"y")==0 || strcmp(num,"Y")==0){head=AddNode(head);}printlist(head);DeleteAll(head); //删除所有结点,释放内存}//==========用尾插入法建立带头结点的单链表===========LinkList CreatListR1(void){char ch[10];LinkList head=(LinkList)malloc(sizeof(ListNode)); //生成头结点ListNode *s,*r,*pp;r=head;r->next=NULL;printf("Input # to end "); //输入"#"代表输入结束printf("\nPlease input Node_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; //返回头指针}//==========用头插入法建立带头结点的单链表===========LinkList CreatList(void){char ch[100];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;}}elsebreak;}return head;}//==========按值查找结点,找到则返回该结点的位置,否则返回NULL========== ListNode *LocateNode(LinkList head, char *key){ListNode *p=head->next; //从开始结点比较while(p!=NULL && strcmp(p->data,key)!=0) //直到p为NULL或p->data为key止p=p->next; //扫描下一个结点return p; //若p=NULL则查找失败,否则p指向找到的值为key的结点//==========修改程序:增加节点=======ListNode * AddNode(LinkList head){char ch[10];ListNode *s,*pp;printf("\nPlease input a New Node_data:");scanf("%s",ch); //输入各结点的字符串pp=LocateNode(head,ch); //按值查找结点,返回结点指针printf("ok2\n");if(pp==NULL) { //没有重复的字符串,插入到链表中s=(ListNode *)malloc(sizeof(ListNode));strcpy(s->data,ch);printf("ok3\n");s->next=head->next;head->next=s;}return head;}//==========删除带头结点的单链表中的指定结点=======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=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:eatInput # 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/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, 请按任意键继续. . .示意图:headheadhead心得体会:本次实验使我们对链表的实质了解更加明确了,对链表的一些基本操作也更加熟练了。

顺序表-链表实验报告.总结

顺序表-链表实验报告.总结

实验报告实验目的:学生管理系统(顺序表)实验要求:1.建表2.求表长3.插入4.查找5.删除6.列表7.退出源程序:#include <stdio.h>#include <string.h>#include<stdlib.h>#define MaxSize 1000typedef struct{char xh[40];char xm[40];int cj;}DataType; //学生的结构typedef struct {DataType data[MaxSize]; //定义表的数据类型int length; //数据元素分别放置在data[0]到data[length-1]当中} SqList; //表的结构void liebiao(SqList *L) //建立表格{int k,n;char q;printf("请输入,输入学生的个数:\n");fflush(stdin);scanf("%d",&n);for(k=0;k<=n-1;k++){printf("请输入学生学号\n");scanf("%s",L->data[k].xh);printf("请输入学生名字\n");scanf("%s",L->data[k].xm);printf("请输入学生成绩\n");scanf("%d",&L->data[k].cj);}L->length=n;}void qb(SqList *L) //全部输出{int k,w;for(k=0;k<L->length;k++){w=k+1;printf("第%d位学生:",w);printf("%s %s %d\n",L->data[k].xh,L->data[k].xm,L->da ta[k].cj);}}int cr(SqList *L,DataType *xs,int i) //插入信息{int j;if(L->length==MaxSize){printf("没有!");return 0;}else if((i<0)||(i>L->length)){printf("程序溢出,不符合");return 0;}else{for(j=L->length-1;j>=i;j--){strcpy(L->data[j+1].xh,L->data[j].xh);strcpy(L->data[j+1].xm,L->data[j].xm);L->data[j+1].cj=L->data[j].cj;}strcpy(L->data[i].xh,xs->xh);strcpy(L->data[i].xm,xs->xm);L->data[i].cj=xs->cj;L->length=L->length+1;}return 0;}int cz(SqList *L) //查找信息{char xh[40];char xm[40];int cj;int i=0,u;printf(" 1、按学号查询 \n");printf(" 1、按姓名查询 \n");printf(" 1、按成绩查询 \n");printf("请选择:");fflush(stdin);scanf("%d",&u);if (u==1){printf("请输入要查找学生的学号:");scanf("%s",xh);for(i=0;i<L->length;i++){if(strcmp(L->data[i].xh,xh)==0)return i;}}if (u==2){printf("请输入要查找学生的姓名:");scanf("%s",xm);for(i=0;i<L->length;i++){if(strcmp(L->data[i].xm,xm)==0)return i;}}if (u==3){printf("请输入要查找学生的成绩:");scanf("%s",cj);for(i=0;i<L->length;i++){if(L->data[i].cj,&cj)return i;}}return -1;//*如果没找到,返回-1}int cz2(SqList *L) //删除查找的函数{char xh[40];char xm[40];int i=0,h;printf(" 1、按学号删除 \n");printf(" 2、按姓名删除 \n");printf("请选择:");fflush(stdin);scanf("%d",&h);if (h==1){printf("请输入要删除学生的学号:");scanf("%s",xh);for(i=0;i<L->length;i++){if(strcmp(L->data[i].xh,xh)==0) //判断输入和已知学号一样不return i;}}else if (h==2){printf("请输入要删除学生的姓名:");scanf("%s",xm);for(i=0;i<L->length;i++){if(strcmp(L->data[i].xm,xm)==0) //判断输入姓名和已知姓名一样不return i;}}return -1;}void sc(SqList *L) //删除函数{int i,j;printf("请先选择您要删除的学生信息的方式:\n");scanf("%d",&j);i=cz2(L);if(i==-1){printf("没有查到要删除的学生信息");return;}for(j=i;j<L->length;j++) // 要删除学生以后的学生整体上调一位{L->data[j].cj=L->data[j+1].cj; //就是后一个覆盖了前一个strcpy(L->data[j].xh,L->data[j+1].xh);strcpy(L->data[j].xm,L->data[j+1].xm);}L->length--;printf("该学生信息已被删除!\n");}int bc(SqList *L){return (L->length);}int main() //主体大函数{int i,k;SqList *L; //定义顺序表的指针DataType *xs;L=(SqList *)malloc(sizeof(SqList)*MaxSize);char q;ee:rewind(stdin);{printf(" 学生管理系统 \n"); //函数的各个结构printf(" \n");printf(" \n");printf(" \n");printf(" 建立表格请输入1 \n");printf(" 求表长请输入2 \n");printf(" 插入请输入3 \n");printf(" 查找请输入4 \n");printf(" 删除请输入5 \n");printf(" 列表请输入6 \n");printf(" 退出请按0 \n");printf(" 请输入");scanf("%c",&q);}if(q=='1'){rewind(stdin);liebiao(L);goto ee;}if(q=='2'){rewind(stdin);bc(L);printf("共%d个学生\n",L->length);goto ee;}if(q=='3'){rewind(stdin);printf(" 插入 \n");printf("\t\t 请输入要添加的学生信息: \n");xs=(DataType *)malloc(sizeof(DataType));printf("请输入学生学号\n");scanf("%s",xs->xh);printf("请输入学生名字\n");scanf("%s",xs->xm);printf("请输入学生成绩\n");scanf("%d",&xs->cj);printf("请输入要插入的位置:\n");rewind(stdin);scanf("%d",&i);cr(L,xs,i);goto ee;}if(q=='4'){rewind(stdin);printf(" 查找 \n");printf(" 查询学生信息 \n");i=cz(L);if(i!=-1){printf("%s %s %d\n",L->data[i].xh,L->data[i].x m,L->data[i].cj);}else{printf("信息不存");}goto ee;}if(q=='5'){rewind(stdin);printf(" 删除 \n"); printf(" 删除学生信息 \n");sc(L);goto ee;}if(q=='6'){rewind(stdin);printf(" 列表 \n");qb(L);goto ee;}if(q=='0') {printf("谢谢使用\n");}if(!(q=='1'||q=='2'||q=='3'||q=='4'||q=='5'||q=='5'||q=='0 ')){goto ee;}system ("pause");return 0;}建表:否是否实验目的:学生管理系统(链表)实验要求:1.建表2.删除3.列表4.退出源程序:#include<stdio.h>#include<string.h>#include<stdlib.h>struct xuesheng{char xh[7];char xm[40];int cj;struct xuesheng *next;};struct xuesheng *cha_ru(struct xuesheng *x){struct xuesheng *p,*q;int c;do{if(x==0){ x=(struct xuesheng *)malloc(sizeof(struct xuesheng));printf("input xh:"); scanf("%s",(*x).xh);printf("input xm:"); scanf("%s",(*x).xm);printf("input cj:"); scanf("%d",&(*x).cj);(*x).next=0; }else{ p=x;while((*p).next!=0){p=(*p).next;};q=(struct xuesheng *)malloc(sizeof(struct xuesheng));printf("input xh:"); scanf("%s",(*q).xh);printf("input xm:"); scanf("%s",(*q).xm);printf("input cj:"); scanf("%d",&(*q).cj);(*p).next=q;(*q).next=0; }printf("ni hai ji xu me? 1/2:");scanf("%d",&c);}while(c==1);return(x);}int link_len(struct xuesheng *x){struct xuesheng *p;int l=0;p=x;if(p!=0)do{l=l+1;p=p->next;}while(p!=0);return(l);}struct xuesheng *shan_chu(struct xuesheng *x){struct xuesheng *p,*q,*t;int k,l,i;p=x;q=x;l=link_len(x);printf("input shan chu jie dian xu hao :");scanf("%d",&k);if(k<=0||k>l)printf("error data!\n");if(k==1){ x=p->next;t=p;free(t);}if(k>1&&k<=l){ for(i=1;i<=k-2;i=i+1)p=p->next;t=p->next;for(i=1;i<=k;i=i+1)q=q->next;p->next=q;free(t); }printf("vvvvvvv shan chu wan bi ! vvvvvvv\n");return(x);}void lie_biao(struct xuesheng *x){struct xuesheng *p;int l;p=x;if(p==0) printf("gai biao wei kong!\n");else do{printf("%20s% 20s%7d\n",(*p).xh,(*p).xm,(*p).cj);p=(*p).next;}while(p!=0);l=link_len(x);printf(" l=%d\n",l);}main(){struct xuesheng *s_head;int n;s_head=0;do{printf("1:cha ru\n");printf("2:cha zhao\n");printf("3:shan chu\n");printf("4:lie biao\n");printf("5:tui chu\n");printf("input 1---5:");scanf("%d",&n);switch(n){case 1: s_head=cha_ru(s_head);break; /* case 2: cha_zhao(s_head);break;*/ case 3: s_head=shan_chu(s_head);break; case 4: lie_biao(s_head);break;}}while(n==1||n==3||n==4);printf("\n");return 0;}主函数:删除:总结:顺序表存储位置是相邻连续的,可以随即访问的一种数据结构,一个顺序表在使用前必须指定起长度,一旦分配内存,则在使用中不可以动态的更改。

c语言链表实验报告

c语言链表实验报告

c语言链表实验报告C语言链表实验报告引言:链表是一种常见的数据结构,它在计算机科学中有着广泛的应用。

通过链表,我们可以动态地存储和操作数据,实现各种复杂的算法和数据结构。

本实验旨在通过使用C语言,实现一个简单的链表结构,并演示其基本操作和应用。

一、链表的定义和基本概念链表是由一系列节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。

相比于数组,链表具有动态性,可以根据需要动态地分配和释放内存空间。

链表的基本概念包括头节点、尾节点、节点插入和节点删除等。

二、链表的实现1. 定义节点结构体在C语言中,我们可以通过定义结构体来表示链表的节点。

结构体中包含一个数据成员和一个指向下一个节点的指针成员。

2. 创建链表为了创建一个链表,我们首先需要定义一个头节点,并将其指针指向NULL。

然后,通过动态分配内存,创建其他节点,并将它们按照一定的顺序链接起来。

3. 插入节点链表的插入操作可以在链表的任意位置进行。

我们可以在头节点之后或者指定节点之后插入新的节点。

插入操作的关键是修改指针的指向,使得新节点能够正确地链接到链表中。

4. 删除节点链表的删除操作可以删除链表中的任意节点。

删除操作的关键是修改指针的指向,使得被删除节点的前一个节点和后一个节点能够正确地链接起来,并释放被删除节点的内存空间。

三、链表的应用链表作为一种常见的数据结构,有着广泛的应用。

以下是链表的一些常见应用场景:1. 队列和栈链表可以用来实现队列和栈这两种常见的数据结构。

通过在链表的头部或尾部进行插入和删除操作,可以实现队列和栈的基本功能。

2. 图的表示在图的表示中,链表可以用来表示图的邻接表。

每个顶点对应一个链表,链表中存储该顶点的邻接点。

通过链表的插入和删除操作,可以方便地修改图的结构。

3. 文件系统在文件系统中,链表可以用来表示文件的目录结构。

每个目录对应一个链表,链表中存储该目录下的文件和子目录。

通过链表的插入和删除操作,可以方便地管理文件和目录。

数据结构(C语言版) 实验报告

数据结构(C语言版) 实验报告

数据结构(C语言版) 实验报告实验报告1·实验目的本实验的目的是通过使用C语言实现各种数据结构,包括链表、栈、队列和树等,以加深对这些数据结构的理解,并学习其基本操作和应用场景。

2·实验环境和工具●操作系统:Windows 10●开发工具:Code::Blocks●编程语言:C语言3·实验内容3·1 链表3·1·1 定义链表结点的结构体3·1·2 创建链表3·1·3 插入结点3·1·4 删除结点3·1·5 遍历链表3·1·6 查找链表中的某个结点3·2 栈3·2·1 定义栈的结构体3·2·2 初始化栈3·2·3 入栈操作3·2·4 出栈操作3·2·5 判断栈是否为空3·2·6 获取栈顶元素3·3 队列3·3·1 定义队列的结构体3·3·2 初始化队列3·3·3 入队操作3·3·4 出队操作3·3·5 判断队列是否为空3·3·6 获取队头元素3·4 树3·4·1 定义树的结构体3·4·2 创建树3·4·3 插入结点3·4·4 删除结点3·4·5 遍历树3·4·6 查找树中的某个结点4·实验结果通过实验,我们成功实现了链表、栈、队列和树的基本操作,并对其进行了测试,验证了其正确性和效果。

5·总结与讨论本次实验使我对数据结构有了更深的理解,通过实际编写代码,加深了对链表、栈、队列和树等数据结构的认识。

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告一、实验目的1、深入理解单链表的数据结构及其基本操作。

2、掌握单链表的创建、插入、删除、查找等操作的实现方法。

3、通过实际编程,提高对数据结构和算法的理解和应用能力。

二、实验环境1、操作系统:Windows 102、编程语言:C 语言3、开发工具:Visual Studio 2019三、实验原理单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据域和指针域。

指针域用于指向下一个节点,从而形成链表的链式结构。

单链表的基本操作包括:1、创建链表:通过动态分配内存创建链表的头节点,并初始化链表为空。

2、插入节点:可以在链表的头部、尾部或指定位置插入新的节点。

3、删除节点:根据给定的条件删除链表中的节点。

4、查找节点:在链表中查找满足特定条件的节点。

四、实验内容(一)单链表的创建```cinclude <stdioh>include <stdlibh>//定义链表节点结构体typedef struct Node {int data;struct Node next;} Node;//创建单链表Node createList(){Node head =(Node)malloc(sizeof(Node));if (head == NULL) {printf("内存分配失败!\n");return NULL;}head>data = 0;head>next = NULL;return head;}int main(){Node list = createList();//后续操作return 0;}```在创建单链表时,首先为头节点分配内存空间。

若内存分配失败,则提示错误信息并返回`NULL`。

成功分配内存后,初始化头节点的数据域和指针域。

(二)单链表的插入操作插入操作分为三种情况:头部插入、尾部插入和指定位置插入。

1、头部插入```cvoid insertAtHead(Node head, int data) {Node newNode =(Node)malloc(sizeof(Node));if (newNode == NULL) {printf("内存分配失败!\n");return;}newNode>data = data;newNode>next = head>next;head>next = newNode;}```头部插入时,创建新节点,将新节点的数据域赋值,并将其指针域指向原头节点的下一个节点,然后更新头节点的指针域指向新节点。

数据结构C语言版实验二报告

数据结构C语言版实验二报告

数据结构C语言版实验二报告实验二报告一、实验目的1、掌握线性表的链式存储结构的表示和实现方法。

2、掌握链表基本操作的算法实现。

二、实验内容1、建立单向链表,并在单链表上实现插入、删除和查找操作(验证性内容)。

2、建立双向链表,并在双向链表上实现插入、删除和查找操作(设计性内容)。

3、计算已知一个单链表中数据域值为一个指定值x的结点个数(应用性设计内容)。

三、知识准备前期要求熟练掌握了C语言的编程规则、方法和单链表和双向链表的基本操作算法。

四、验证性试验试验要求编程实现如下功能:(1)根据输入的一系列整数,以0标志结束,用头插法建立单链表,并输出单链表中各元素值,观察输入的内容与输出的内容是否一致。

(2)在单链表的第i个元素之前插入一个值为x的元素,并输出插入后的单链表中各元素值。

(3)删除单链表中第i个元素,并输出删除后的单链表中各元素值。

(4)在单链表中查找第i个元素,如果查找成功,则显示该元素的值,否则显示该元素不存在。

五、设计性试验编程实现在双向循环链表上的插入和删除操作实验要求(1)输入链表的长度和各元素的值,用尾插法建立双向循环链表,并输出链表中各元素值,观察输入的内容与输出的内容是否一致。

(2)在双向循环链表的第i个元素之前插入一个值为x的元素,并输出插入后的链表中各元素值。

(3)删除双向循环链表中第i个元素,并输出删除后的链表中各元素值。

(4)在双向循环链表中查找值为x元素,如果查找成功,则显示该元素在链表中的位置,否则显示该元素不存在。

六、应用性设计实验编写一个程序,计算出一个单链表中数据域值为一个指定值x的结点个数。

实验要求:(1)从键盘输入若干个整数,以此序列为顺序建立一个不带头结点的单向链表;(2)输出此单链表中d的各个数据元素值;(3)给定一个x的具体整数值,计算并返回此单链表中数据域值为x的结点个数值。

程序代码:一、验证性实验:#include#includetypedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;LinkList CreateEnd(LinkList L)//尾插法{L=(LinkList)malloc(sizeof(LNode));LinkList p,q;L->next=NULL;q=L;int node=-1;printf("end of 0!\n");for(;;){p=(LinkList)malloc(sizeof(LNode)); printf("please input you node!\n"); scanf("%d",&node);if(node==0)break;p->data=node;p->next=NULL;q->next=p;q=q->next;}return L;}LinkList CreateHead(LinkList L)//头差法{ int node;LinkList p;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;printf("end of 0!\n");for(;;){printf("please input you node:\n"); scanf("%d",&node);if(node==0)break;p=(LinkList)malloc(sizeof(LNode));p->data=node;p->next=L->next;L->next=p;}return L;}void display(LinkList L)//输出函数{printf("output linklist!\n");for(L=L->next;L->next!=NULL;L=L->next) {printf("%d ",L->data);}printf("%d\n",L->data);}void Delete(LinkList &L,int i)//删除第i个元素{int j;LinkList p,q;for(j=0,p=L;p->next&&jnext);if(j>i||!p)printf("ERRPR!\n");else{q=p->next;p->next=q->next;free(q);printf("OK!\n");}}void Insert(LinkList &L,int i,LinkList e)//在第i个元素前插入e { int j;LinkList p;for(j=0,p=L;p->next&&jnext);if(j>i||!p)printf("ERROR!\n");else{e->next=p->next;p->next=e;printf("OK!\n");}}void main(){LinkList L,e;L=CreateEnd(L);display(L);int i;printf("input you delete node:\n");scanf("%d",&i);Delete(L,i);display(L);printf("input you new node:\n");e=(LinkList)malloc(sizeof(LNode));scanf("%d",&e->data);e->next=NULL;printf("input you insert position:\n");scanf("%d",&i);Insert(L,i,e);display(L);}二、设计性实验#include#includetypedef struct LNode{struct LNode *prior;int data;struct LNode *next;}LNode,*LinkList;LinkList Create(LinkList L)//尾插法{L=(LinkList)malloc(sizeof(LNode)); LinkList p,E;L->prior=L->next=L;E=L;int node=-1;printf("end of 0!\n");for(;;){p=(LinkList)malloc(sizeof(LNode)); printf("please input you node!\n"); scanf("%d",&node);if(node==0)break;p->data=node;p->next=E->next;E->next=p;p->prior=E;E=p;L->prior=E;return L;}void display(LinkList L)//输出函数{printf("output linklist!\n");LinkList p;p=L;for(p=p->next;p!=L;p=p->next){printf("%d ",p->data);}printf("\n");}int Delete(LinkList &L,int i)//删除第i个元素{int j,e=NULL;LinkList p,q;for(j=0,p=L;p->next!=L&&jnext);if(j>i||p==L)printf("ERRPR!\n");else{e=p->next->data;q=p->next;p->next=q->next;q->next->prior=p;free(q);printf("OK!\n");return e;}void Insert(LinkList &L,int i,LinkList e)//在第i个元素前插入e { int j;LinkList p;for(j=0,p=L;p->next!=L&&jnext);if(j>i||L==p)printf("ERROR!\n");else{e->next=p->next;e->prior=p;p->next=e;e->next->prior=e;printf("OK!\n");}}void Search(LinkList L,int i){int j;LinkList p;for(j=1,p=L->next;p!=L;p=p->next){if(p->data==i)break;j++;}if(p==L||i<=0)printf("ERROR!\n");elseprintf("position is:%d\n",j);}void main(){LinkList L,e;L=Create(L);display(L);int i;printf("input you delete node:\n");scanf("%d",&i);printf("%d\n",Delete(L,i));display(L);printf("input you new node:\n");e=(LinkList)malloc(sizeof(LNode));scanf("%d",&e->data);printf("input you insert position:\n");scanf("%d",&i);Insert(L,i,e);display(L);printf("\ninput you want search of integer:\n"); scanf("%d",&i);Search(L,i);}三、应用性实验#include#includetypedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;void Create(LinkList &L)//尾插法{LinkList p,q;L=(LinkList)malloc(sizeof(LNode)); L->next=NULL;int e;for(q=L;;q=p){p=(LinkList)malloc(sizeof(LNode)); printf("end of 0:\n");scanf("%d",&e);if(e==0)break;p->data=e;p->next=q->next;q->next=p;}q=L;L=L->next;free(q);}void display(LinkList L){LinkList q;for(q=L;q;q=q->next)printf("%d ",q->data);printf("\n");}int search(LinkList L,int i){int j=0;for(;L;L=L->next)if(L->data==i)j++;return j;}void main(){LinkList L;Create(L);display(L);int i;printf("input you want search of integer:\n"); scanf("%d",&i);printf("%d",search(L,i)); }。

C语言程序设计实训报告 链表操作

C语言程序设计实训报告  链表操作
<1>初始化函数····································································································· 5 <2>求表长··········································································································· 5 <3>按序号查找元素······························································································· 5 <4>删除元素········································································································ 5 <5>插入元素········································································································ 5 <6>按值查找元素·································································································· 5 四 实验数据和结果分析···································································································· 6 1.实验数据················································································································· 6 2.结果分析················································································································· 6 五 心得体会··················································································································7 六 附录 1························································································································8 七 附录 2························································································································9
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

链表实验报告
一、实验名称
链表操作的实现--学生信息库的构建
二、实验目的
(1)理解单链表的存储结构及基本操作的定义
(2)掌握单链表存储基本操作
(3)学会设计实验数据验证程序
【实验仪器及环境】计算机 Window XP操作系统
三、实验内容
1、建立一个学生成绩信息(学号,姓名,成绩)的单链表,按学号排序
2、对链表进行插入、删除、遍历、修改操作。

3、对链表进行读取(读文件)、存储(写文件)
四、实验要求
(1)给出终结报告(包括设计过程,程序)-打印版
(2)对程序进行答辩
五、实验过程、详细内容
1、概念及过程中需要调用的函数
(1)链表的概念结点定义
结构的递归定义
struct stud_node{
int num;
char name[20];
int score;
struct stud_node *next;
};
(2)链表的建立
1、手动输入
struct stud_node*Create_Stu_Doc()
{
struct stud_node *head,*p;
int num,score;
char name[20];
int size=sizeof(struct stud_node);
【链表建立流程图】
2、从文件中直接获取 先建立一个
(3)链表的遍历
(4
(5)删除结点
(6)动态储存分配函数malloc () void *malloc(unsigned size)
①在内存的动态存储区中分配一连续空间,其长度为size
②若申请成功,则返回一个指向所分配内存空间的起始地址的指针 ③若申请不成功,则返回NULL (值为0) ④返回值类型:(void *) ·通用指针的一个重要用途
·将malloc 的返回值转换到特定指针类型,赋给一个指针
【链表建立流程图】
ptr
ptr
ptr->num
ptr->score ptr=ptr->next
head pt r
s s->next = ptr->next ptr->next = s 先连后断 ptr2=ptr1->next
ptr1->next=ptr2->next
free (ptr2)
(7)动态储存释放函数free()
当某个动态分配的存储块不再用时,要及时将它释放
void free(void *ptr)
释放由动态存储分配函数申请到的整块内存空间,ptr为指向要释放空间的首地址。

(8)链表写入文件
(9)链表的读取
六、实验总结
链表弥补了许多数组的缺点,例如,
1、数组在添加新元素时,如果添加的位置是数组的首部或者数组中间,那么我们必须设计算法移动相关元素,并且涉及到许多相关元素;
2、删除元素时,如果删除的不是尾部元素,同样会移动其他元素。

因此使用数组处理大量元素时,会影响程序的整体效率。

但是链表在搜索或随机读写内部元素的时远不如数组操作起来方便。

计算机1403班
李彦霖
1416010319。

相关文档
最新文档