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语言版)实验报告
实验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语言,实现一个简单的链表结构,并演示其基本操作和应用。
一、链表的定义和基本概念链表是由一系列节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。
相比于数组,链表具有动态性,可以根据需要动态地分配和释放内存空间。
链表的基本概念包括头节点、尾节点、节点插入和节点删除等。
二、链表的实现1. 定义节点结构体在C语言中,我们可以通过定义结构体来表示链表的节点。
结构体中包含一个数据成员和一个指向下一个节点的指针成员。
2. 创建链表为了创建一个链表,我们首先需要定义一个头节点,并将其指针指向NULL。
然后,通过动态分配内存,创建其他节点,并将它们按照一定的顺序链接起来。
3. 插入节点链表的插入操作可以在链表的任意位置进行。
我们可以在头节点之后或者指定节点之后插入新的节点。
插入操作的关键是修改指针的指向,使得新节点能够正确地链接到链表中。
4. 删除节点链表的删除操作可以删除链表中的任意节点。
删除操作的关键是修改指针的指向,使得被删除节点的前一个节点和后一个节点能够正确地链接起来,并释放被删除节点的内存空间。
三、链表的应用链表作为一种常见的数据结构,有着广泛的应用。
以下是链表的一些常见应用场景:1. 队列和栈链表可以用来实现队列和栈这两种常见的数据结构。
通过在链表的头部或尾部进行插入和删除操作,可以实现队列和栈的基本功能。
2. 图的表示在图的表示中,链表可以用来表示图的邻接表。
每个顶点对应一个链表,链表中存储该顶点的邻接点。
通过链表的插入和删除操作,可以方便地修改图的结构。
3. 文件系统在文件系统中,链表可以用来表示文件的目录结构。
每个目录对应一个链表,链表中存储该目录下的文件和子目录。
通过链表的插入和删除操作,可以方便地管理文件和目录。
数据结构(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语言版实验二报告实验二报告一、实验目的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语言 实验报告15
实验十五链表实验实验目的:1、了解链表的基本结构2、熟悉结构体指针的定义和操作3、熟练掌握基于单链表的各种操作。
实验内容:基于链表结构实现一个简单的通讯录管理系统,实现通讯录的简单电子化。
该系统具有增加新记录、修改原记录、删除原记录、根据姓名查找和查看所有记录等功能。
增加新记录即将由键盘输入的数据形成一个节点添加到表尾。
参考界面如图1。
图1 增加新记录参考界面修改原记录为根据输入的用户名查找到链表中的原记录,将其值修改为重新输入的值。
参考界面如图2。
图2 修改原记录参考界面删除原记录与修改原记录相似,通过输入的用户名查找到原记录所在节点,然后删除该节点。
参考界面如图3。
图3 删除原记录参考界面根据姓名查找即通过输入的姓名输出该人的全部详细信息。
参考界面如图4。
图4 根据姓名查找参考界面查看所有记录即输出该通讯录中所有人的详细信息。
参考界面如图5。
图5 查看所有记录参考界面实验1、算法思想:先建立链表中的信息,在main函数中用switch进行相应抄作的判断,再编写相应的函数来实现要求的功能程序清单:#include<stdio.h>#include<stdlib.h>#include<string.h>struct stud_node{char name[20];char sex[10];char birth[11];char addr[30];char tel[15];char mobile[15];char email[20];struct stud_node *next;};struct stud_node * InsertDoc(struct stud_node * head, struct stud_node *stud);struct stud_node * DeleteDoc(struct stud_node * head, char *name);void Print_Stu_Doc(struct stud_node * head);struct stud_node * FindDoc(struct stud_node * head,char *name);int main(void){struct stud_node *head,*p;int choice;char name[20],sex[10],birth[11],addr[30],tel[15],mobile[15],email[20]; int size = sizeof(struct stud_node);head=NULL;do{printf("\n 通讯录管理系统\n");printf("********************************\n");printf("* *\n");printf("* 1----增加新记录*\n");printf("* 2----修改原记录*\n");printf("* 3----删除原记录*\n");printf("* 4----根据姓名查找*\n");printf("* 5----查看所有记录*\n");printf("* 6----退出*\n");printf("* *\n");printf("********************************\n");scanf("%d", &choice);switch(choice){case 1:printf("请输入新增人员信息\n");printf("姓名:");scanf("%s", name);printf("性别:");scanf("%s", sex);printf("出生年月:");scanf("%s", birth);printf("地址:");scanf("%s", addr);printf("联系电话:");scanf("%s", tel);printf("手机:");scanf("%s", mobile);printf("email:");scanf("%s", email);p = (struct stud_node *) malloc(size);strcpy(p->name, name);strcpy(p->sex, sex);strcpy(p->birth, birth);strcpy(p->addr, addr);strcpy(p->tel, tel);strcpy(p->mobile, mobile);strcpy(p->email, email);p->next=NULL;head=InsertDoc(head, p);break;case 2:printf("请输入要修改信息人的姓名:");scanf("%s",name);if((p=FindDoc(head,name))!=NULL){printf("-------------------------------\n");printf("姓名:%s\n",p->name);printf("性别:%s\n",p->sex);printf("出生年月:%s\n",p->birth);printf("地址:%s\n",p->addr);printf("联系电话:%s\n",p->tel);printf("手机:%s\n",p->mobile);printf("email:%s\n",p->email);printf("-------------------------------\n");printf("请录入个人信息:\n");printf("姓名:");scanf("%s", p->name);printf("性别:");scanf("%s", p->sex);printf("出生年月:");scanf("%s", p->birth);printf("地址:");scanf("%s", p->addr);printf("联系电话:");scanf("%s", p->tel);printf("手机:");scanf("%s", p->mobile);printf("email:");scanf("%s", p->email);printf("修改后的信息为:\n");printf("-------------------------------\n");printf("姓名:%s\n",p->name);printf("性别:%s\n",p->sex);printf("出生年月:%s\n",p->birth);printf("地址:%s\n",p->addr);printf("联系电话:%s\n",p->tel);printf("手机:%s\n",p->mobile);printf("email:%s\n",p->email);printf("-------------------------------\n");}elseprintf("没有这个人的信息\n");break;case 3:printf("输入要删除人员姓名:\n");scanf("%s", name);if((p=FindDoc(head,name))!=NULL)head = DeleteDoc(head, name);elseprintf("没有这个人的信息\n");break;case 4:printf("请输入要查找的姓名:");scanf("%s",name);if((p=FindDoc(head,name))!=NULL){printf("-------------------------------\n");printf("姓名:%s\n",p->name);printf("性别:%s\n",p->sex);printf("出生年月:%s\n",p->birth);printf("地址:%s\n",p->addr);printf("联系电话:%s\n",p->tel);printf("手机:%s\n",p->mobile);printf("email:%s\n",p->email);printf("-------------------------------\n");}elseprintf("没有这个人的信息\n");break;case 5:Print_Stu_Doc(head);break;case 6:break;}}while(choice != 6);return 0;}struct stud_node * InsertDoc(struct stud_node * head, struct stud_node *stud){struct stud_node *ptr ;ptr = stud;if(head == NULL){head = ptr;head->next = NULL;}else{ptr->next=head;head=ptr;}return head;}struct stud_node * DeleteDoc(struct stud_node * head, char *name){struct stud_node *ptr1, *ptr2;while(head!=NULL && strcmp(head->name,name) == 0){ptr2 = head;head = head->next;free(ptr2);}if(head == NULL)return NULL;ptr1 = head;ptr2 = head->next;while(ptr2!=NULL){if(strcmp(ptr2->name,name) == 0){ptr1->next = ptr2->next;free(ptr2);}elseptr1 = ptr2;ptr2 = ptr1->next;}return head;}void Print_Stu_Doc(struct stud_node * head){ struct stud_node * p;if(head == NULL){printf("\n没有记录\n");return;}printf("\n通讯录中的记录为: \n");p = head;while( p!=NULL){printf("-------------------------------\n");printf("姓名:%s\n",p->name);printf("性别:%s\n",p->sex);printf("出生年月:%s\n",p->birth);printf("地址:%s\n",p->addr);printf("联系电话:%s\n",p->tel);printf("手机:%s\n",p->mobile);printf("email:%s\n",p->email);p = p->next;}}struct stud_node * FindDoc(struct stud_node * head,char *name){struct stud_node * p=head;while(p!=NULL){if(strcmp(p->name,name)==0)return p;else p=p->next;}return p;}测试数据与实验结果:实验心得:。
C语言链表的应用报告
实验十五.链表的应用班级:电子(2)班学号:E10610203 姓名:李燕美一.实验目的:1.掌握链表的概念。
2.熟悉对链表的一些基本操作和具体的函数定义。
3.使用有关单链表的操作来实现通讯录信息系统的管理。
二、实验内容:实现一个简单的通讯录管理系统,要求建立一个通讯录信息(姓名、电话号码)的单向链表,能够实现对通讯录信息的插入、修改、删除、查找(按姓名)和遍历操作。
要求程序运行后,能给出6个菜单项的内容和输入提示:1、通讯录结点的插入2、通讯录结点的修改3、通讯录结点的删除4、通讯录结点的查找5、通讯录链表的输出6、退出管理系统请选择0~6:然后根据用户的输入执行相应的操作,链表及菜单实现可以参考教材例11-11。
三、实验过程:1、程序清单:#include<stdio.h>#include<stdlib.h>#include<string.h>struct friends_list{char name[20];int telephone[13];struct friends_list *f;};struct friends_list *Create_Fri_Doc();struct friends_list *InsertDoc(struct friends_list*head,structfriends_list *fr);struct friends_list *UpdateDoc(struct friends_list*head,char name,char telephone);struct friends_list *DeleteDoc(struct friends_list *head,char name);struct friends_list *friends_listSearchDoc(struct friends_list*head,char name);void Print_Fri_Doc(struct freind_list *head);int main(void){struct friends_list *head,*p;int choice;char name[20];char telephone[13];int size=sizeof(struct friends_list);do{printf("0:新建 1:通讯录结点的插入2:通讯录结点的修改3:通讯录结点的删除4:通讯录结点的查找5:通讯录链表的输出6:退出管理系统\n");printf("请选择 0~6");scanf("%d",&choice);switch(choice){case 0:head=Create_Fri_Doc();break;case 1:printf("Enter name and telephone:\n");scanf("%s%d",&name,&telephone);p=(struct friends_list *)malloc(size);strcpy(p->name=name);strcpy(p->telephone=telephone);head=InsertDoc(head,p);break;case 2:printf("Enter telephone\n");scanf("%d",&telephone);head=RepairDoc(head,telephone,name);break;case 3:printf("Enter name\n") ;scanf("%s,&name");head=DeleteDoc(head,name);break;case 4:printf("Enter name\n");scanf("%s",&name);head=SearchDoc(head,name);break;case 5:Print_Fri_Doc(head);break;case 6:break;}}while(choice!=6);return 0;}struct friends_list *Create_Fri_Doc(){struct friends_list *head,*t,*p;char name[20],s[20];char telephone[13];head=t=NULL;printf("Enter name and telephone:\n");scanf("%s %s",&name,&telephone);while(s[20]=(strcmp(name,"白")!=0){p=(struct friends_list*)malloc(size);strcpy(p->name,name);strcpy(p->telephone,telephone);p->f==NULL;if(head==NULL)head=p;elset->f=p;t=p;scanf("%s %s",&name,&telephone);}return head;}struct friends_list *InsertDoc(struct friends_list*head,struct friends_list *fr){struct friends_list *ptr,*ptr1,*ptr2;ptr2=head;ptr=fr;if(head=NULL){head=ptr;head->f=NULL;}return head;}struct friends_list *RepairDoc(struct friends_list*head,*fr) { struct friends_list *ptr1,*ptr2;while(head->name==name)head->telephone[13]=telephone[13];ptr2=head->f;if(ptr2->name==name){ptr2->telephone[13]=telephone[13];}elseptr1=ptr2;ptr2=ptr1->f;}return head;}struct *DeleteDoc(struct friends_list *head,char name){struct friends_list *ptr1,*ptr2;while(head!=NULL&&head->name==name){ptr2=head;head=head->f;free(ptr2);}if(head==NULL)return NULL;ptr1=head;ptr2=head->f;while(ptr2!=NULL){if(ptr2->name==name){ptr1->f=ptr2->f;free(ptr2);}elseptr1=ptr2;ptr2=ptr1->f;}return head;}struct friends_list*friends_listSearchDoc(struct friends_list*head,char name) {struct friends_list *ptr1,*ptr2;while(head->name==name){printf("姓名:%s 电话:%s",ptr2->name,ptr2->telephone);}elseptr1=ptr2;ptr2=ptr1->f;}return head;}void Print_Fri_Doc(struct freinds_list *head){struct friends_list *ptr;if(head==NULL){printf("\nNo Friends\n");return;}printf("\nThe friends Telephone Are:\n");printf(" 姓名电话\n");for(ptr=head;ptr;ptr=ptr->f)printf("%20sd %20d\n",ptr->name,ptr->telephone);}2.分析与思考:在开始试验时,在编写插入结点和删除结点时,忽略了插入原则和删除原则是先连后断和先接后删,导致编译时出错好多。
实验链表实验报告
实验链表实验报告一、实验目的本次实验的主要目的是深入理解链表这种数据结构的概念、特点和操作方法,并通过实际编程实现来提高对链表的应用能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验原理链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
与数组不同,链表的内存分配是动态的,并且可以方便地进行插入和删除操作,而不需要移动大量的元素。
链表分为单向链表、双向链表和循环链表等多种类型。
在本次实验中,我们主要实现单向链表。
单向链表的节点结构通常包含数据域和指针域。
数据域用于存储节点的数据,指针域用于指向下一个节点。
通过遍历链表的指针,可以访问链表中的每个节点。
四、实验内容1、链表节点的定义```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};```2、链表的创建```cppListNode createList(){ListNode head = NULL;ListNode tail = NULL;int num;cout <<"请输入链表中的数字(输入-1 结束):";cin >> num;while (num!=-1) {ListNode newNode = new ListNode(num);if (head == NULL) {head = newNode;tail = newNode;} else {tail>next = newNode;tail = newNode;}cin >> num;}return head;}```3、链表的遍历```cppvoid traverseList(ListNode head) {ListNode curr = head;while (curr!= NULL) {cout << curr>data <<"";curr = curr>next;}cout << endl;}```4、链表的插入```cppvoid insertNode(ListNode& head, int position, int value) {ListNode newNode = new ListNode(value);if (position == 0) {newNode>next = head;head = newNode;return;}ListNode curr = head;int count = 0;while (curr!= NULL && count < position 1) {curr = curr>next;count++;}if (curr == NULL) {cout <<"插入位置超出链表长度" << endl; return;}newNode>next = curr>next;curr>next = newNode;}```5、链表的删除```cppvoid deleteNode(ListNode& head, int position) {if (head == NULL) {cout <<"链表为空,无法删除" << endl; return;}if (position == 0) {ListNode temp = head;head = head>next;delete temp;return;}ListNode curr = head;ListNode prev = NULL;int count = 0;while (curr!= NULL && count < position) {prev = curr;curr = curr>next;count++;}if (curr == NULL) {cout <<"删除位置超出链表长度" << endl; return;}prev>next = curr>next;delete curr;}```五、实验结果通过对上述链表操作函数的调用,我们成功地创建、遍历、插入和删除了链表中的节点。
链表实验报告总结
链表实验报告总结篇一:顺序表,链表总结实验报告实验报告实验目的:学生管理系统(顺序表)实验要求:1.建表2.求表长3.插入4.查找5.删除6.列表7.退出源程序:#include#include#include#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 {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;klength;k++){w=k+1;printf("第%d位学生:",w);printf("%s %s%d\n",L->data[k].xh,L->data[k].xm,L->d ata[k].cj);}}int cr(SqList *L,DataType *xs,int i) //插入信息{int j;if(L->length==MaxSize){printf("没有!");return 0;else if((iL->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;ilength;i++){篇二:单链表的实验报告辽宁工程技术大学上机实验报告篇三:单链表实验报告实验一线性表基本操作的编程实现--线性表在链表存储下的主要操作实现班级:T523-1 姓名:王娟学号:33完成日期: 地点:5502学时:2学时一、需求分析【实验目的】通过本次实验,对课堂上线性表的知识进行巩固,进一步熟悉线性表的链接存储及相应的基本操作;并熟练掌握VC++ 6.0操作平台,学会调试程序,以及编写电子实验报告【实验要求】编写线性表的基本操作,有构造线性表,线性表的遍历,插入,删除,查找,求表长等基本功能,在此基础上能够加入DOS下的图形界面以及学会文件的操作等功能,为以后的学习打下基础。
c课程设计链表实验报告
c课程设计链表实验报告一、教学目标本节课的教学目标是让学生掌握链表的基本概念和操作,包括链表的定义、节点的结构、链表的创建、插入、删除和遍历等操作。
通过本节课的学习,学生应该能够理解链表的工作原理,熟练使用链表进行数据存储和操作,并能够编写相应的程序实现链表功能。
具体来说,知识目标包括:1.了解链表的定义和特点;2.掌握链表的基本操作及其时间复杂度;3.理解链表在数据存储和处理中的应用场景。
技能目标包括:1.能够使用编程语言实现链表的创建、插入、删除和遍历等基本操作;2.能够分析链表程序的正确性和性能;3.能够运用链表解决实际问题,如实现一个简单的链表排序算法。
情感态度价值观目标包括:1.培养学生的逻辑思维能力和问题解决能力;2.激发学生对计算机科学和编程的兴趣;3.培养学生的团队合作意识和代码规范意识。
二、教学内容本节课的教学内容主要包括链表的基本概念和操作。
具体安排如下:1.链表的定义和特点:介绍链表的概念、节点结构以及链表的两种类型(单向链表和双向链表);2.链表的创建:讲解如何创建一个链表,包括初始化节点和链接节点的方法;3.链表的插入操作:介绍如何在链表中插入一个新节点,包括头插法和中插法的实现;4.链表的删除操作:讲解如何删除链表中的一个节点,包括头删法和中删法的实现;5.链表的遍历操作:介绍如何遍历链表,实现链表中各个节点的访问和打印;6.链表的应用场景:举例说明链表在实际编程中的应用,如链表排序算法。
三、教学方法为了达到本节课的教学目标,将采用以下教学方法:1.讲授法:讲解链表的基本概念和原理,引导学生理解链表的工作方式;2.案例分析法:通过分析典型链表程序,让学生掌握链表的操作方法和技巧;3.实验法:让学生动手编写链表程序,培养学生的实际编程能力和问题解决能力;4.讨论法:学生进行小组讨论,分享学习心得和编程经验,提高学生的团队合作意识。
四、教学资源为了支持本节课的教学内容和教学方法的实施,将准备以下教学资源:1.教材:《数据结构与算法》;2.参考书:《链表:原理与实现》;3.多媒体资料:PPT课件、链表操作视频教程;4.实验设备:计算机、编程环境。
c语言链表程序设计
C语言程序设计实验报告实验八、链表程序设计【实验目的】(1)掌握链表的概念、定义和使用;(2)掌握链表中结点的建立、插入、删除方法;【实验内容及步骤】1、下列程序中,子函数insertup(head,newp)实现将一个newp 所指新结点按升序插入到由头指针head所指的链表中的适当位置;请将函数补充完整,并编写主程序;【程序代码】:struct member{int num;struct member *next;};typedef struct member Member;insertup(Member *head, Member *newp){Member *pre,*suc;pre=head;suc=head->next;while (suc==NULL){if (suc->num >=newp->num){pre->next=newp;newp->next=suc;return;}pre=suc;suc=suc->next;}pre->next=newp;//当要插入的节点中的数据在链表中是最大值时,将它插入链表尾newp->next=NULL;}void main(){Member*head=(Member*)malloc(sizeof(Member)),node1,node2,node3,node4,*node;=4;=6;head->next=&node1;=&node2;=NULL;printf("创建新链表:\n");node=head->next;while(node!=NULL){printf("%5d\n",node->num);node=node->next;}=1;//为新节点赋值insertup(head,&node3);printf("插入数据为%d的节点后,链表变为:\n",;node=head->next;while(node!=NULL){printf("%5d\n",node->num);node=node->next;}}【运行结果】分别为新节点node3的数据域赋值1,5,15。
链表的实验报告
班级学号姓名实验组别试验日期室温报告日期成绩报告内容:(目的和要求、原理、步骤、数据、计算、小结等)实验名称:链表的实现与应用实验目的:1.掌握链表的概念。
2.熟练掌握线性表的链式存储结构。
3.熟练掌握线性表在链式存储结构上的运算。
实验环境(硬/软件要求):Windows 2000, Visual C++ 6.0实验内容:1.编写算法,根据用户输入的字符数据用尾插入法创建一个带头结点的单链表,“#”作为输入数据的结束符。
2.编写算法,实现在带有头结点的单链表中按序号查找的函数。
假设单链表中包含6个数据元素,测试数据是:①查找第0个;②查找第一个;③查找第2个;④查找第6个;⑤查找第7个;实验要求1.完成链表存储结构的类型设计。
2.完成链表带头结点尾插入法函数。
3.完成按序号查找函数。
4.编写主函数完成实验内容的要求。
【C语言源程序】#include <stdio.h>#include<stdlib.h>typedef char datatype;typedef struct node{datatype data;struct node *next;}linklist;linklist *createlist()/*尾插入法建立带头结点的单链表,返回表头指针*/{linklist*head,*s,*r;head=(linklist*)malloc(sizeof(linklist));/*生成头结点head*/r=head;printf("请输入字符产生的链表,以#结束\n");/*尾指针指向头结点*/ch=getchar();while(ch!='#') /*“#”为输入结束符*/{s=(linklist*)malloc(sizeof(linklist)); /*生成新结点*s*/s->data=ch;r->next=s; /*新结点插入表尾*/r=s; /*尾指针r指向新的表尾*/ch=getchar(); /*读入下一个结点的值*/}r->next=NULL;return head; /*返回表头指针*/} /*createlist*//*在带头结点的单链表head中查找第i个结点,若找到,则返回该结点的存储位置;否则返回NULL*/linklist *get(linklist *head,int i){int j;linklist *p;p=head;j=0; /*从头结点开始扫描*/while((p->next!=NULL) && (j<i)){p=p->next; /*扫描下一个结点*/j++; /*已扫描结点计数器*/}if(i==j)return p; /*找到第i个结点*/else return NULL; /*找不到,i<=0或i>n*/} /*GET*/void main(){linklist *head,*r;int num;head=createlist();printf("链表信息为:");r=head->next;while(r){printf("%c",r->data);r=r->next;}printf("请输入要查询的序号:\n");scanf("%d",&num);r=get(head,num);if(r==NULL)printf("没有查到\n");printf("查到的结果为:%c\n",r->data); }。
单链表的操作实验报告
单链表的操作实验报告单链表的操作实验报告引言:单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
在本次实验中,我们将学习如何使用C语言实现单链表的基本操作,包括插入、删除和查找等。
一、单链表的定义和初始化单链表由节点组成,每个节点包含数据和指向下一个节点的指针。
首先,我们需要定义一个节点的结构体,如下所示:```struct Node {int data; // 节点数据struct Node* next; // 指向下一个节点的指针};```在初始化单链表之前,我们需要创建一个头节点,它不存储任何数据,只用于指向第一个节点。
初始化单链表的代码如下:```struct Node* head = NULL; // 头节点初始化为空```二、单链表的插入操作插入操作是向单链表中添加新节点的过程。
我们可以在链表的头部、尾部或者指定位置插入新节点。
下面以在链表头部插入新节点为例进行说明。
首先,我们需要创建一个新节点,并为其分配内存空间:```struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));```然后,为新节点赋值并将其插入到链表头部:```newNode->data = 10; // 赋值新节点的数据newNode->next = head; // 将新节点的指针指向原头节点head = newNode; // 将头节点指向新节点```三、单链表的删除操作删除操作是从单链表中删除指定节点的过程。
我们可以根据节点的位置或者数据进行删除。
下面以删除链表中指定数据的节点为例进行说明。
首先,我们需要遍历链表找到要删除的节点,并记录其前一个节点的地址:```struct Node* current = head;struct Node* previous = NULL;int targetData = 10; // 要删除的节点数据while (current != NULL && current->data != targetData) {previous = current;current = current->next;}```然后,将前一个节点的指针指向要删除节点的下一个节点,并释放要删除节点的内存空间:```previous->next = current->next;free(current);```四、单链表的查找操作查找操作是在单链表中查找指定数据的节点。
C语言链表实验报告
链表实验报告一、实验名称链表操作的实现--学生信息库的构建二、实验目的(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 的返回值转换到特定指针类型,赋给一个指针【链表建立流程图】ptrptrptr->numptr->score ptr=ptr->nexthead pt rs s->next = ptr->next ptr->next = s 先连后断 ptr2=ptr1->nextptr1->next=ptr2->nextfree (ptr2)(7)动态储存释放函数free()当某个动态分配的存储块不再用时,要及时将它释放void free(void *ptr)释放由动态存储分配函数申请到的整块内存空间,ptr为指向要释放空间的首地址。
链表实验报告
C语言实验报告实验目的:链表的基本操作添加,删除,排序#include <iostream.h>#include <string.h>#include <stdlib.h>struct StuNode{char ID[10];char Name[10];int Height;StuNode *next;};typedef StuNode stulist;void Addafter (stulist * list,char * id,char * name,int height){if(!list||!id) return;StuNode *p=new StuNode;strcpy(p->ID,id);strcpy(p->Name,name);p->Height=height;StuNode *q=list;while(q->next){q=q->next;}q->next=p;p->next=NULL;}void ShowNode(stulist * list){cout<<"现有数据是:"<<endl;StuNode *p=list->next;while(p){cout<<p->ID<<" "<<p->Name<<" "<<p->Height<<endl;p=p->next;}cout<<endl<<"*************************************"<<endl; }void Insert (stulist * list){char Beid[10]="2014002";char id[10]="1112223";char name[10]="狗蛋";int height=177;if(!list||!id) return;StuNode *p=new StuNode;strcpy(p->ID,id);strcpy(p->Name,name);p->Height=height;StuNode *q=list;while(strcmp(q->ID,Beid)!=0){q=q->next;}p->next=q->next;q->next=p;}void Delete(stulist * list){char id[10]="2014001";StuNode *q=list;StuNode *d=q->next;while(strcmp(d->ID,id)!=0){q=q->next;d=d->next;}q->next=d->next;delete d;}void main(){stulist list_1;list_1.next=NULL;char name[10],id[10];int height;Addafter(&list_1,"2014001","张三",175);Addafter(&list_1,"2014002","李四",180);Addafter(&list_1,"2014003","王二",173);Addafter(&list_1,"2014004","麻子",179);ShowNode(&list_1);cout<<"现在添加马六"<<endl;Addafter(&list_1,"2014999","马六",180);ShowNode(&list_1);cout<<"现在把狗蛋插入到李四后面"<<endl;Insert(&list_1);ShowNode(&list_1);cout<<"现在删除张三"<<endl;Delete(&list_1);ShowNode(&list_1);}实验总结:通过学习链表的操作,让知道了C语言和C++是有着紧密联系的,让我能更加熟练了数组,指针,结构体等一些基本的c++语言知识,而且知道了怎么添加修改和排序的一些方法。
链表的基本操作实验报告
《数据结构》实验报告学号1445203105 姓名王胜博班级软件5班成绩实验名称实验三链表的基本操作是否原创是一、实验要求编程实现链表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其编程一个完整的小软件。
二、实验目的通过该实验,深入理解链表的逻辑结构、物理结构等概念,掌握链表基本操作的编程实现,熟练掌握C语言中指针的操作。
和实验2对比,掌握线性结构两种不同存储方式的区别。
三、设计思想用函数执行各个功能,随机插入元素四、主要源代码#include<stdio.h>#include<stdlib.h>#include<time.h>typedef int ElemType;typedef struct Node{ElemType data;struct Node *next;}Node, *LinkList;void InitList(LinkList *L){*L=(LinkList)malloc(sizeof(Node));if(!(*L))printf("存储分配失败\n");(*L)->next=NULL;}void DestroyList(LinkList L){LinkList p;while(L){p=L->next;free(L);L=p;}}int ListLength(LinkList L){LinkList p;int i=0;p=L->next;while(p){i++;p=p->next;}return i;}int GetElem(LinkList L,int i,ElemType &e){ LinkList p;p=L->next;int j=1;while(p&&j<i){p=p->next;++j;}e=p->data;return e;}int GetElemLo(LinkList L,int i,ElemType &e){ LinkList p;p=L->next;int j=1;while(p->data!=i&&j<=ListLength(L)){p=p->next;++j;}e=j;return e;}void FindPre(LinkList L,int x){LinkList p;p=L;if(p->next->data==x){printf("第一个元素没有前驱\n");}else{while(p->next){if(p->next->data==x){printf("%d的前驱结点是:%d\n",x,p->data);break;}else{p=p->next;}}}}void FindNext(LinkList L,int x){LinkList p;p=L->next;while(p){if(p->data==x){printf("%d的后继结点是:%d\n",x,p->next->data);break;}else{p=p->next;}if(p->next==NULL){printf("最后一个元素没有后继\n");break;}}}void LinkInset_L(LinkList &L,int i,ElemType e){ LinkList p;p=L;int j=0;while(p&&j<i-1){p=p->next;++j;}if(!p||j>i-1)printf("i小于1或者i大于表长加1\n");LinkList s;s=(LinkList)malloc(sizeof (Node));s->data=e;s->next=p->next;p->next=s;}void ListDelete_L(LinkList &L,int i,ElemType &e){ LinkList p,q;p=L;int j=0;while(p->next && j<i-1){p=p->next;++j;}if(!p->next ||j>i-1)printf("删除位置不合理\n");q=p->next;p->next=q->next;e=q->data;free(q);printf("已删除的元素是:%d\n",e);}void visit(ElemType e){printf("%d,",e);}void ListTraverse(LinkList L){LinkList p=L->next;while(p){visit(p->data);p=p->next;}printf("\n");}void CreatListTail(LinkList *L,int n){LinkList p,r;int i;srand(time(0));*L=(LinkList)malloc(sizeof(Node));r=*L;for(i=0;i<n;i++){p=(Node *)malloc(sizeof(Node));p->data=rand()%100+1;r->next=p;r=p;}r->next=NULL;}int main(){LinkList L;int opp;printf("可执行的操作有:\n");printf("1.初始化或重置链表\n");printf("2.随机插入元素\n");printf("3.显示链表中数据元素个数\n");printf("4.输出所输入的链表元素\n");printf("5.所指位序的元素值\n");printf("6.链表已存在元素的位序\n");printf("7.请输入元素,求直接前驱\n");printf("8.请输入元素,求直接后继\n");printf("9.在第i个位置插入元素\n");printf("10.删除第i个元素\n");printf("11.销毁链表\n");printf("12.退出\n");printf("\n");printf("请输入你的选择:\n");do{scanf("%d",&opp);switch(opp){case 1:{InitList(&L);printf("链表已初始化\n");printf("下一步操作:");break;}case 2:{int n;printf("输入插入元素个数:");scanf("%d",&n);CreatListTail(&L,n);printf("下一步操作:");break;}case 3:{printf("链表中元素的个数是:%d\n",ListLength(L));printf("下一步操作:");break;}case 4:{ListTraverse(L);printf("下一步操作:");break;}case 5:{int m,e;printf("输入要取元素的位置:");scanf("%d",&m);if(m>ListLength(L)){printf("输入有误\n");}else{GetElem(L,m,e);printf("该元素是:%d\n",e);}printf("下一步操作:");break;}case 6:{int i,e;printf("输入要取的元素:");scanf("%d",&i);GetElemLo(L,i,e);printf("该元素的位置是:%d\n",e);printf("下一步操作:");break;}case 7:{int x;printf("要求哪个元素的前驱?");scanf("%d",&x);FindPre(L,x);printf("下一步操作:");break;}case 8:{int x;printf("要求哪个元素的后继?");scanf("%d",&x);FindNext(L,x);printf("下一步操作:");break;}case 9:{int i,e;printf("在哪个位置插入元素?");scanf("%d",&i);if(i>ListLength(L))printf("输入有误\n");else{printf("插入的新元素是:");scanf("%d",&e);LinkInset_L(L,i,e);printf("新链表:");ListTraverse(L);}printf("下一步操作:");break;}case 10:{int i,e;printf("要删除哪个位置的元素?");scanf("%d",&i);if(i>ListLength(L))printf("输入有误\n");else{ListDelete_L(L,i,e);printf("新链表:");ListTraverse(L);}printf("下一步操作:");break;}case 11:{DestroyList(L);printf("链表已销毁!\n");printf("下一步操作:");break;}case 12:{printf("谢谢使用\n");break;}default:{printf("输入错误,请重新输入\n");break;}}}while(opp!=12);return 0;}五、调试与测试数据六、实验总结。
c课程设计报告链表
c课程设计报告链表一、教学目标本课程的教学目标是使学生掌握链表的基本概念、实现方式和应用场景。
具体包括:1.知识目标:学生能够理解链表的定义、特点和基本操作,了解单向链表、双向链表和循环链表的区别和应用。
2.技能目标:学生能够使用编程语言实现链表,包括创建、插入、删除和遍历等基本操作。
3.情感态度价值观目标:通过学习链表,培养学生对计算机科学的兴趣和热情,提高学生的问题解决能力和创新意识。
二、教学内容本课程的教学内容主要包括链表的基本概念、实现方式和应用场景。
具体包括:1.链表的定义和特点:介绍链表的定义、特点和基本操作。
2.单向链表:讲解单向链表的实现方式和相关操作,如创建、插入、删除和遍历。
3.双向链表:介绍双向链表的概念和实现方式,讲解双向链表的相关操作,如创建、插入、删除和遍历。
4.循环链表:讲解循环链表的定义和实现方式,介绍循环链表的应用场景。
5.链表的应用:介绍链表在实际应用中的例子,如链表的数据结构、链表的排序和查找等。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法,包括:1.讲授法:通过讲解链表的基本概念、实现方式和应用场景,使学生掌握链表的知识。
2.讨论法:学生进行小组讨论,探讨链表的操作方法和实现细节,促进学生的思考和交流。
3.案例分析法:通过分析实际应用中的链表例子,使学生了解链表在实际中的应用场景和效果。
4.实验法:安排学生进行编程实验,实现链表的基本操作,培养学生的动手能力和问题解决能力。
四、教学资源为了支持教学内容和教学方法的实施,本课程将使用以下教学资源:1.教材:选择一本与链表相关的教材,作为学生学习的主要参考资料。
2.参考书:提供一些与链表相关的参考书籍,供学生深入学习和研究。
3.多媒体资料:制作一些与链表相关的多媒体课件和演示视频,帮助学生更好地理解和掌握链表的知识。
4.实验设备:提供计算机和相关编程工具,供学生进行编程实验和实践。
五、教学评估本课程的评估方式包括平时表现、作业和考试等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。