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

合集下载

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

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

《数据结构》实验报告姓名:**学号:*********成绩:_____目录实验一,线性表的应用 (3)实验二,栈和队列的应用 (8)实验三,数组的应用 (13)实验四,树和二叉树的应用 (19)实验五,图的应用 (24)实验六,查找表的应用 (32)实验七,排序算法的应用 (44)实验一线性表的应用【实验目的】1.熟练掌握线性表的基本操作在顺序存储和链式存储上的实现;2.以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;3.掌握线性表的动态分配顺序存储结构的定义和基本实现;4.通过对本章实验帮助学生加深对C语言的使用(特别是函数参数调用、指针类型的应用和链表的建立等各种基本操作)。

【实验内容】约瑟夫问题的实现:n只猴子要选猴王,所有猴子按1,2,…,n编号围坐一圈,从第1只开始按1,2,…,m报数,凡报到m号的猴子退出圈外,如此循环报数,直到圈内省剩下一只猴子时,这个猴子就是猴王。

编写一个程序实现上述过程,n和m由键盘输入。

【实验要求】1.要求用顺序表和链表分别实现约瑟夫问题;2.独立完成,严禁抄袭;3.上交的实验报告由如下部分组成:①实验名称②实验目的③实验内容(问题描述,算法描述,程序清单,测试结果,算法分析)。

实验结果:一,源程序:#include<stdio.h> #include<stdlib.h>#define Maxsize 80struct SeqList{int data[Maxsize];int len;};typedef struct SeqList SeqList;void InitList(SeqList *L){L=(SeqList *)malloc(sizeof(SeqList)); L->len=0;}void MadeList(SeqList *L){int i;int people;printf("请输入参选的总数:\n"); scanf("%d",&people);for (i=0;i<people;i++){L->data[i]=i+1;printf(" %d ",L->data[i]); }printf("\n");L->len=people;}void WentList(SeqList *L){int m,i,j;int k=0;printf("请输入出列数:\n"); scanf("%d",&m);for (i=L->len;i>0;i--){k=(k+m-1)%i;printf(" %d ",L->data[k]); for (j=k;j<i-1;j++){L->data[j]=L->data[j+1]; }L->len=L->len-1;}printf("\n");}void main(){SeqList *L;InitList(L);MadeList(L);WentList(L);}二,运行结果及截屏视图:实验二栈和列队的应用【实验目的】1.熟练掌握栈和列队的结构,以及这两种数据结构的特点;2.能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空时的判断条件和描述方法;3.熟练掌握链队列和循环列表的基本运算,特别注意队列满和队列空时的判断条件和描述方法。

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

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

数据结构(C语言版) 实验报告学院计算机科学与技术专业计算机大类强化学号xxx班级xxx姓名xxx指导教师xxx实验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(); //修改程序:增加节点。

《数据结构》实验报告

《数据结构》实验报告

苏州科技学院数据结构(C语言版)实验报告专业班级测绘1011学号10201151姓名XX实习地点C1 机房指导教师史守正目录封面 (1)目录 (2)实验一线性表 (3)一、程序设计的基本思想,原理和算法描述 (3)二、源程序及注释(打包上传) (3)三、运行输出结果 (4)四、调试和运行程序过程中产生的问题及采取的措施 (6)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (6)实验二栈和队列 (7)一、程序设计的基本思想,原理和算法描述 (8)二、源程序及注释(打包上传) (8)三、运行输出结果 (8)四、调试和运行程序过程中产生的问题及采取的措施 (10)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (10)实验三树和二叉树 (11)一、程序设计的基本思想,原理和算法描述 (11)二、源程序及注释(打包上传) (12)三、运行输出结果 (12)四、调试和运行程序过程中产生的问题及采取的措施 (12)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (12)实验四图 (13)一、程序设计的基本思想,原理和算法描述 (13)二、源程序及注释(打包上传) (14)三、运行输出结果 (14)四、调试和运行程序过程中产生的问题及采取的措施 (15)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (16)实验五查找 (17)一、程序设计的基本思想,原理和算法描述 (17)二、源程序及注释(打包上传) (18)三、运行输出结果 (18)四、调试和运行程序过程中产生的问题及采取的措施 (19)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (19)实验六排序 (20)一、程序设计的基本思想,原理和算法描述 (20)二、源程序及注释(打包上传) (21)三、运行输出结果 (21)四、调试和运行程序过程中产生的问题及采取的措施 (24)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (24)实验一线性表一、程序设计的基本思想,原理和算法描述:程序的主要分为自定义函数、主函数。

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

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

数据结构C语言版实验报告一、实验目的本次实验旨在通过使用 C 语言实现常见的数据结构,加深对数据结构基本概念、原理和操作的理解,提高编程能力和解决实际问题的能力。

二、实验环境操作系统:Windows 10编程环境:Visual Studio 2019编程语言:C 语言三、实验内容1、线性表顺序表的实现与操作链表的实现与操作2、栈和队列栈的实现与应用(表达式求值)队列的实现与应用(模拟排队)3、树和二叉树二叉树的遍历(前序、中序、后序)二叉搜索树的实现与操作4、图图的存储结构(邻接矩阵、邻接表)图的遍历(深度优先搜索、广度优先搜索)四、实验步骤及结果1、线性表顺序表的实现与操作定义顺序表的数据结构,包括数组和表的长度。

实现顺序表的初始化、插入、删除、查找等操作。

测试顺序表的各种操作,输出操作结果。

```cinclude <stdioh>include <stdlibh>define MAX_SIZE 100typedef struct {int dataMAX_SIZE;int length;} SeqList;//初始化顺序表void initList(SeqList L) {L>length = 0;}//插入元素到顺序表int insertList(SeqList L, int pos, int element) {if (L>length >= MAX_SIZE || pos < 0 || pos > L>length) {return 0;}for (int i = L>length 1; i >= pos; i) {L>datai + 1 = L>datai;}L>datapos = element;L>length++;return 1;}//删除顺序表中的元素int deleteList(SeqList L, int pos) {if (pos < 0 || pos >= L>length) {return 0;}for (int i = pos; i < L>length 1; i++){L>datai = L>datai + 1;}L>length;return 1;}//查找顺序表中的元素int searchList(SeqList L, int element) {for (int i = 0; i < Llength; i++){if (Ldatai == element) {return i;}}return -1;}int main(){SeqList L;initList(&L);insertList(&L, 0, 10);insertList(&L, 1, 20);insertList(&L, 2, 30);printf("顺序表元素: ");for (int i = 0; i < Llength; i++){printf("%d ", Ldatai);}printf("\n");int pos = searchList(L, 20);if (pos!=-1) {printf("元素 20 在顺序表中的位置: %d\n", pos);} else {printf("顺序表中未找到元素 20\n");}deleteList(&L, 1);printf("删除元素后的顺序表元素: ");for (int i = 0; i < Llength; i++){printf("%d ", Ldatai);}printf("\n");return 0;}```实验结果:成功实现顺序表的初始化、插入、删除、查找等操作,输出结果符合预期。

数据结构(C语言版)实验报告(哈夫曼树)

数据结构(C语言版)实验报告(哈夫曼树)

《数据结构与算法》实验报告一、需求分析1.问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。

对于双工通道(及可以双向传输信息的通道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼的编/译码系统。

2.基本要求一个完整的系统应具有以下功能:(1)I:初始化(Initialization)。

从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。

(2)E:编码(Encoding)。

利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

(3)D:译码(Decoding)。

利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。

(4)P:印代码文件(Print)。

将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件CodePrin中。

(5)T:印哈夫曼树(Tree printing)。

将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示出,同时将此字符形式的哈夫曼树写入文件TreePrint中。

3.测试数据(1)利用教科书例6-2中的数据调试程序。

(2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。

4,实现提示(1)编码结果以文本方式存储在文件CodeFile中。

(2)用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”表示退出运行Quit。

请用户键入一个选择功能符。

此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。

(3)在程序的一次执行过程中,第一次执行I、D或C命令之后,哈夫曼树已经在内存了,不必再读入。

数据结构实验实训报告范文

数据结构实验实训报告范文

一、实验目的1. 理解并掌握数据结构的基本概念和常用算法。

2. 学会使用C语言实现线性表、栈、队列、树和图等基本数据结构。

3. 培养动手实践能力,提高编程水平。

二、实验内容1. 线性表(1)顺序表(2)链表2. 栈(1)顺序栈(2)链栈3. 队列(1)顺序队列(2)链队列4. 树(1)二叉树(2)二叉搜索树5. 图(1)邻接矩阵表示法(2)邻接表表示法三、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 编译器:Visual Studio 20194. 实验软件:C语言开发环境四、实验步骤1. 线性表(1)顺序表1)定义顺序表结构体2)实现顺序表的初始化、插入、删除、查找等基本操作3)编写测试程序,验证顺序表的基本操作(2)链表1)定义链表结构体2)实现链表的创建、插入、删除、查找等基本操作3)编写测试程序,验证链表的基本操作2. 栈(1)顺序栈1)定义顺序栈结构体2)实现顺序栈的初始化、入栈、出栈、判空等基本操作3)编写测试程序,验证顺序栈的基本操作(2)链栈1)定义链栈结构体2)实现链栈的初始化、入栈、出栈、判空等基本操作3)编写测试程序,验证链栈的基本操作3. 队列(1)顺序队列1)定义顺序队列结构体2)实现顺序队列的初始化、入队、出队、判空等基本操作3)编写测试程序,验证顺序队列的基本操作(2)链队列1)定义链队列结构体2)实现链队列的初始化、入队、出队、判空等基本操作3)编写测试程序,验证链队列的基本操作4. 树(1)二叉树1)定义二叉树结构体2)实现二叉树的创建、遍历、查找等基本操作3)编写测试程序,验证二叉树的基本操作(2)二叉搜索树1)定义二叉搜索树结构体2)实现二叉搜索树的创建、遍历、查找等基本操作3)编写测试程序,验证二叉搜索树的基本操作5. 图(1)邻接矩阵表示法1)定义邻接矩阵结构体2)实现图的创建、添加边、删除边、遍历等基本操作3)编写测试程序,验证邻接矩阵表示法的基本操作(2)邻接表表示法1)定义邻接表结构体2)实现图的创建、添加边、删除边、遍历等基本操作3)编写测试程序,验证邻接表表示法的基本操作五、实验结果与分析1. 线性表(1)顺序表实验结果表明,顺序表的基本操作实现正确,测试程序运行稳定。

数据结构实验报告(C语言)(强力推荐)

数据结构实验报告(C语言)(强力推荐)

数据结构实验实验内容和目的:掌握几种基本的数据结构:集合、线性结构、树形结构等在求解实际问题中的应用,以及培养书写规范文档的技巧。

学习基本的查找和排序技术。

让我们在实际上机中具有编制相当规模的程序的能力。

养成一种良好的程序设计风格。

实验教材:数据结构题集(C语言版)清华大学出版社2007年实验项目:实验一、栈和循环队列㈠、实验内容:①栈掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。

本程序采用的是链栈结构,具有初始化一个栈、PUSH、POP、显示所有栈里的元素四个功能。

②循环队列掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等,学会循环队列的实现,以便在实际问题背景下灵活运用。

本程序具有初始化一个队列、入队、出队、显示队列的所有元素、队列长度五个功能。

㈡、实验代码①栈程序代码:#include <stdio.h>#include <malloc.h>#define Stack_Size 6#define ERROR 0#define OK 1typedef int SElemType;typedef struct SNode{SElemType data;struct SNode *next;}SNode,*LinkStack;int CreatTwo(LinkStack &head,int n){int i;SNode *p;head=(LinkStack)malloc(sizeof(SNode));head->next=NULL;printf("请输入数据(数字):\n");for(i=n;i>0;--i){p=(SNode *)malloc(sizeof(SNode));scanf("%d",&p->data);p->next=head->next;head->next=p;}return 1;}int menu_select(){int sn;for(;;){scanf("%d",&sn);if(sn<1||sn>6)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}int Push(LinkStack &top,SElemType e){SNode *q;q=(LinkStack)malloc(sizeof(SNode));if(!q){printf("溢出!\n");return(ERROR);}q->data=e;q->next=top->next;top->next=q;return(OK);}int Pop(LinkStack &top,SElemType &e){SNode *q;if(!top->next){printf("error!\n");return(ERROR);}e=top->next->data;q=top->next;top->next=q->next;free(q);return(OK);}void main(){ int e;LinkStack top;printf("1.初始化一个栈;\n2.PUSH;\n3.POP;\n4.显示所有栈里的元素;\n5.结束;\n");while(1){switch(menu_select()){case 1:if(CreatTwo(top,Stack_Size))printf("Success!\n");break; case 2:printf("Push:\n");scanf("%d",&e);if(Push(top,e))printf("Success!\n");break;case 3:if(Pop(top,e))printf("Success!\n");printf("%d\n",e);break;case 4:LinkStack p;printf("所有栈里的元素:\n");p=top;while(p->next){p=p->next;printf("%7d",p->data);}printf("\n");break;case 5:return;}}}运行结果:②循环队列程序代码:#include<stdlib.h>#include<stdio.h>#define OVERFLOW -1#define OK 1#define ERROR 0#define MAXSIZE 100typedef struct{int *elem;//队列存储空间int front;int rear;}SqQueue;//判断选择是否正确int menu_select(){int sn;for(;;){scanf("%d",&sn);if(sn<1||sn>6)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}//参数(传出)SqQueue &Q,循环队列(空)int InitQueue(SqQueue &Q){Q.elem=(int *)malloc(MAXSIZE*sizeof(int));if(!Q.elem)exit(OVERFLOW);Q.front=Q.rear=-1;for(int i=0;i<MAXSIZE;i++)Q.elem[i]=-1;return OK;}//返回Q的元素个数int QueueLength(SqQueue Q){return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;}//显示队列的元素void Display(SqQueue Q){for(int i=0;i<=QueueLength(Q);i++)if(Q.elem[i]!=-1)printf("%d ",Q.elem[i]);printf("\n");}//入队int EnQueue(SqQueue &Q,int e){Q.rear=(Q.rear+1)%MAXSIZE;if(Q.rear==Q.front)return ERROR;Q.elem[Q.rear]=e;return OK;}//出队int DeQueue(SqQueue &Q,int &e){if(Q.front==Q.rear)return ERROR;e=Q.elem[Q.front+1];Q.elem[Q.front+1]=-1;Q.front=(Q.front+1)%MAXSIZE;return OK;}void main(){SqQueue Q;InitQueue(Q);int elem,e;printf("请输入队列元素(以0结束):\n");scanf("%d",&elem);while(elem!=0){EnQueue(Q,elem);scanf("%d",&elem);}printf("队列为:\n");Display(Q);printf("1.初始化一个队列;\n2.入队;\n3.出队;\n4.显示队列的所有元素;\n5.队列长度:\n6.结束;\n");while(1){switch(menu_select()){case 1:printf("请输入队列元素(以0结束):\n");scanf("%d",&elem);while(elem!=0){EnQueue(Q,elem);scanf("%d",&elem);}printf("队列为:\n");Display(Q);fflush(stdin);break;case 2:scanf("%d",&elem);EnQueue(Q,elem);printf("队列为:\n");Display(Q);fflush(stdin);break;case 3:DeQueue(Q,elem);printf("队列为:\n");Display(Q);break;case 4:printf("\n队列的所有元素:\n");Display(Q);break;case 5:printf("%d\n",QueueLength(Q));break;case 6:return;}}}运行结果:实验二、数组㈠、实验内容:数组一般不做插入或删除操作,也就是说,一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。

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

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

数据结构C语言版实验报告HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】数据结构(C语言版) 实验报告专业:计算机科学与技术、软件工程学号:_______________________班级:_________软件二班______________姓名:________朱海霞______________指导教师:___刘遵仁________________青岛大学信息工程学院2013年10月实验1实验题目:顺序存储结构线性表的插入和删除实验目的:了解和掌握线性表的逻辑结构和顺序存储结构,掌握线性表的基本算法及相关的时间性能分析。

实验要求:建立一个数据域定义为整数类型的线性表,在表中允许有重复的数据;根据输入的数据,先找到相应的存储单元,后删除之。

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

2、调试程序,并设计输入一组数据(3,-5,6,8,2,-5,4,7,-9),测试程序的如下功能:根据输入的数据,找到相应的存储单元并删除,显示表中所有的数据。

程序代码:#include<>#include<>#define OK 1#define ERROR 0#define OVERFLOW -2#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct{int* elem;int length;int listsize;}Sqlist;int InitList_Sq(Sqlist &L){=(int*)malloc(LIST_INIT_SIZE*sizeof(int));if(! return -1;=0;=LIST_INIT_SIZE;return OK;}int ListInsert_Sq(Sqlist&L,int i,int e){if(i<1||i>+1) return ERROR;if=={int *newbase;newbase=(int*)realloc,+LISTINCREMENT)*sizeof(int));if(!newbase) return -1;=newbase;+=LISTINCREMENT;}int *p,*q;q=&[i-1]);for(p=&[]);p>=q;--p)*(p+1)=*p;*q=e;++;return OK;}int ListDelete_Sq(Sqlist &L,int i,int e){int *p,*q;if(i<1||i>return ERROR;p=&[i-1]);e=*p;q=+;for(++p;p<=q;++p)*(p-1)=*p;;return OK;}int main(){Sqlist L;InitList_Sq(L);ertex=a; irstedge=NULL; irstedge;G->adjlist[i].firstedge=s; irstedge;G->adjlist[j].firstedge=s; //将新结点*S插入顶点Vj的边表头部}}//=========定义标志向量,为全局变量=======typedef enum{FALSE,TRUE} Boolean;Boolean visited[MaxVertexNum];//========DFS:深度优先遍历的递归算法======void DFSM(ALGraph *G,int i){ //以Vi为出发点对邻接链表表示的图G进行DFS搜索给出你的编码//==========BFS:广度优先遍历=========void BFS(ALGraph *G,int k){ //以Vk为源点对用邻接链表表示的图G进行广度优先搜索给出你的编码//==========主函数===========void main(){int i;ALGraph *G;G=(ALGraph *)malloc(sizeof(ALGraph));CreatALGraph(G);printf("Print Graph DFS: ");DFS(G);printf("\n");printf("Print Graph BFS: "); BFS(G,3);printf("\n");}实验结果:1.邻接矩阵作为存储结构2.邻接链表作为存储结构心得体会:实验6实验题目:二分查找算法的实现实验目的:掌握二分查找法的工作原理及应用过程,利用其工作原理完成实验题目中的内容。

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

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

数据结构(C语言版) 实验报告学院信息工程学院班级15计科2班学号********姓名张旭指导教师曹晨实验一线性表基本操作和简单程序1.实验目的(1)复习Visual C++ 6.0上机调试程序的基本方法及C语言编程;(2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在链表存储结构上的程序设计方法。

2.实验要求(1)认真阅读和掌握和本实验相关的教材内容。

(2)分别以头插法和尾插法建立两个数据域定义为整型的升序单链表,再将这两个有序链表合并成一个新的无重复元素的有序链表,最后可以根据输入的数据,先找到相应的结点,后删除之。

(3)上机运行程序。

(4)保存和打印出程序的运行结果,并结合程序进行分析。

3.程序代码#include<stdio.h>#include<stdlib.h>typedef struct node{int data;struct node *next;}node;node * qbuild(node *first){int i,n,a[100];node *s;printf("输入n:");scanf("%d",&n);first=(node*)malloc(sizeof(node));first->next=NULL;for(i=0;i<n;i++){s=(node*)malloc(sizeof(node));printf("输入a[%d]:",i);scanf("%d",&a[i]);s->data=a[i];s->next=first->next;first->next=s;}return first;}node * hbuild(node *first){int i,n,a[100];struct node *s,*r;printf("输入n:");scanf("%d",&n);first=(node*)malloc(sizeof(node));r=first;for(i=0;i<n;i++){s=(node*)malloc(sizeof(node)); printf("输入a[%d]:",i);scanf("%d",&a[i]);s->data=a[i];r->next=s;r=s;}r->next=NULL;return first;}node * hebing(node *La,node *Lb){node *pa,*pb,*pc,*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 if(pa->data > pb->data){pc->next =pb;pc=pb;pb=pb->next;}else{pc->next =pa;pc=pa;pa=pa->next ;pb=pb->next ;}}pc->next =pa?pa:pb;free(Lb);return Lc;}node * shanchu(node *first,int i) {node *p,*q;p=first->next;while(p){if((p->next )->data==i){q=p->next ;p->next =q->next;free(q);break;}p=p->next;}return first;}void display(node *first){struct node *p;p=first->next;while(p!=NULL){printf("%d ",p->data);p=p->next;}printf("\n");}int main(){int m;struct node *a,*b,*c;a=qbuild(a);printf("打印链表a:");display(a);b=hbuild(b);printf("打印链表b:");display(b);c=hebing(a,b);printf("打印链表c:");display(c);printf("输入删除的数m:");scanf("%d",&m);c=shanchu(c,m);printf("打印删除后的链表c:");display(c);return 0;}4.实验结果输入n:5输入a[0]:9输入a[1]:5输入a[2]:4输入a[3]:3输入a[4]:1打印链表a:1 3 4 5 9输入n:5输入a[0]:1输入a[1]:3输入a[2]:4输入a[3]:6输入a[4]:8打印链表b:1 3 4 6 8打印链表c:1 3 4 5 6 8 9输入删除的数m:5打印删除后的链表c:1 3 4 6 8 9--------------------------------Process exited after 32.78 seconds with return value 0请按任意键继续. . .5.心得体会本次实验是以后实验的基础,是数据结构中最基本的东西。

数据结构实验报告c语言版

数据结构实验报告c语言版

数据结构实验报告c语言版数据结构实验报告(C语言版)引言:数据结构是计算机科学中的重要概念,它关注如何在计算机中存储和组织数据以便有效地访问和操作。

本实验报告将介绍在C语言中实现的一些常见数据结构及其应用。

一、线性表线性表是最基本的数据结构之一,它是一种有序的数据元素的集合。

在C语言中,可以使用数组或链表来实现线性表。

数组具有固定大小的优点,但插入和删除操作较为复杂。

链表则可以动态地分配内存,但访问元素需要遍历整个链表。

二、栈和队列栈和队列是两种特殊的线性表。

栈是一种后进先出(LIFO)的数据结构,可以使用数组或链表实现。

常见的应用包括函数调用、表达式求值等。

队列是一种先进先出(FIFO)的数据结构,同样可以使用数组或链表实现。

它常用于任务调度、消息传递等场景。

三、树树是一种非线性的数据结构,它由节点和边组成。

树的每个节点可以有零个或多个子节点,其中一个节点被称为根节点。

常见的树结构包括二叉树、二叉搜索树、平衡二叉树等。

树的应用广泛,例如文件系统、数据库索引等。

四、图图是由节点和边组成的非线性数据结构,它可以用来表示各种实体之间的关系。

图可以是有向的或无向的,可以是带权重的或无权重的。

图的常见应用包括社交网络、路由算法等。

在C语言中,图通常使用邻接矩阵或邻接表来表示。

五、排序算法排序算法是数据结构中的经典问题之一。

常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。

每种排序算法都有其特点和适用场景,选择合适的排序算法可以提高程序的效率。

六、查找算法查找算法是在数据集中查找指定元素的过程。

常见的查找算法包括线性查找、二分查找、哈希查找等。

线性查找适用于无序数据集,而二分查找适用于有序数据集。

哈希查找通过散列函数将关键字映射到存储位置,可以快速定位元素。

七、实验总结通过本次实验,我们学习了C语言中常见的数据结构及其应用。

线性表、栈和队列是最基本的数据结构,树和图则提供了更灵活的数据组织方式。

数据结构(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. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 20194. 实训教材:《数据结构》(C语言版)三、实训内容本次实训主要内容包括线性表、栈、队列、树、图等基本数据结构的创建、操作和应用。

1. 线性表(1)单链表的创建、插入、删除和查找操作(2)双向链表的创建、插入、删除和查找操作(3)循环链表的创建、插入、删除和查找操作2. 栈(1)栈的创建、入栈、出栈和判断栈空操作(2)应用栈实现括号匹配3. 队列(1)队列的创建、入队、出队和判断队列空操作(2)应用队列实现广度优先搜索4. 树(1)二叉树的创建、插入、删除和遍历操作(2)二叉查找树的创建、插入、删除和查找操作5. 图(1)图的创建、添加边、删除边和遍历操作(2)图的深度优先遍历和广度优先遍历四、实训过程1. 线性表首先,我们学习了单链表、双向链表和循环链表的基本概念和创建方法。

通过编写代码,实现了链表的插入、删除和查找操作。

在实训过程中,我们遇到了一些问题,如链表插入操作时指针的移动、删除操作时避免内存泄漏等。

通过查阅资料和与同学讨论,我们逐步解决了这些问题。

2. 栈接着,我们学习了栈的基本概念和操作方法。

通过编写代码,实现了栈的创建、入栈、出栈和判断栈空操作。

在实训过程中,我们遇到了栈空和栈满的情况,通过设置标志位和循环队列的方法解决了这些问题。

此外,我们还学习了应用栈实现括号匹配,加深了对栈的应用理解。

3. 队列然后,我们学习了队列的基本概念和操作方法。

通过编写代码,实现了队列的创建、入队、出队和判断队列空操作。

在实训过程中,我们遇到了队列空和队列满的情况,通过设置标志位和循环队列的方法解决了这些问题。

C语言数据结构实验报告

C语言数据结构实验报告

江西科技师范学院实验报告课程:数据结构系别:数计学院班级:09计算机(1)班学号:张抗姓名:20091592报告规格一实验目的二实验原理三实验设备四实验内容五实验代码六实验结果目录1. 实验一:C语言编程2. 实验二:顺序存储3.实验三:链式存储4.实验四:模式匹配算法运用5.实验五:特殊矩阵6.实验六:内排序7.实验七:内排序8.实验八:图的遍历9.实验九:检索10.11.12.13.14.15.每次实验课必须带上此本子,以便教师检查预习情况和记录实验原始数据。

实验时必须遵守实验规则。

用正确的理论指导实践必须人人亲自动手实验,但反对盲目乱动,更不能无故损坏设备。

这是一份重要的不可多得的自我学习资料,它将记录着你在大学生涯中的学习和学习成果。

请你保留下来,若干年后再翻阅仍将感到十分新鲜,记忆犹新。

它将推动你在人生奋斗的道路上永往直前!实验一C语言编程实验名称:实验一C语言编程实验目的:复习C语言程序设计,回顾C语言结构数据及指针数据的应用。

实验原理:C语言结构化程序设计思想,结构数据类型,指针数据类型。

实验设备:电脑,TURBO C2.0/WIN-TC/VISUAL C++实验内容:求两个复数相加之和。

实验代码:#include<stdio.h>struct comp //定义复数的类型结构{ float x;float y;};struct comp a,b,sum,jian1,mul1;int z;void main(){ void creat(struct comp*c); //声明所用到的函数void output(struct comp a);struct comp add(struct comp k,struct comp h);struct comp jian(struct comp k,struct comp h);struct comp mul(struct comp k,struct comp h);creat(&a);output(a);creat(&b);output(a);sum=add(a,b);printf("sum=");output(sum);jian1=jian(a,b);printf("jian=");output(jian1);mul1=mul(a,b);printf("mul=");output(mul1);getch();}void creat(struct comp*c) //输入{ float c1,c2;printf("please enter the record:");scanf("%f",&c1);printf("please enter the image:");scanf("%f",&c2);c->x=c1;c->y=c2;}void output(struct comp a) //输出{ printf("%f+%fi\n\n",a.x,a.y);}struct comp add(struct comp k,struct comp h) //相加{ struct comp c;c.x=k.x+h.x;c.y=k.y+h.y;return(c);}struct comp jian(struct comp k,struct comp h) //相减{ struct comp c;c.x=k.x-h.x;c.y=k.y-h.y;return(c);}struct comp mul(struct comp k,struct comp h) //相乘{ struct comp c;c.x=k.x*h.x-k.y*h.y;c.y=h.x*k.y+k.x*h.y;return(c);}实验结果:实验心得:计算机事实上只能完成较简单的运算,不能完成较复杂的运算。

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

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

实验主要步骤
( 1)数据从键盘读入; ( 2)输出要判断的字符串; ( 3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出 “ No”。
“Yes”,否则输出
程序代码 :
实验结果:
心得体会:
实验 4
实验题目 :二叉树操作设计和实现
实验目的 :
掌握二叉树的定义、性质及存储方式,各种遍历算法。
//AdjList 是邻接表类型
typedef struct {
AdjList adjlist;
//邻接表
int n,e;
// 图中当前顶点数和边数
} ALGraph;
//图类型
//========= 建立图的邻接表 =======
void CreatALGraph(ALGraph *G)
{
int i,j,k;
for(i=0;i<G->n;i++)
//建立边表
{
scanf("%c",&a);
G->adjlist[i].vertex=a;
//读入顶点信息
G->adjlist[i].firstedge=NULL; }
//边表置为空表
printf("Input edges,Creat Adjacency List\n");
实验主要步骤:
设计一个有向图和一个无向图,任选一种存储结构,完成有向图和无向图的 度优先遍历)和 BFS(广度优先遍历)的操作。
DFS(深
1. 邻接矩阵作为存储结构
#include"stdio.h"
#include"stdlib.h"

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

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

数据结构(C语言版) 实验报告数据结构(C语言版) 实验报告第一章引言本实验报告主要介绍了在C语言环境下进行数据结构实验的相关内容。

数据结构是计算机科学中最基础的一门课程,它主要涉及到如何将数据组织和存储以便高效地访问和操作。

本实验报告将按照以下章节进行详细介绍。

第二章实验目的本实验的主要目的是通过实践操作,加深对数据结构的理解,并运用C语言编写相应的数据结构代码。

第三章实验环境1.操作系统:________Windows 102.编程语言:________C语言3.开发工具:________Visual Studio Code第四章实验内容1.线性表1.1 顺序表的实现1.1.1 初始化线性表1.1.2 插入操作1.1.3 删除操作1.1.4 查找操作1.2 链表的实现1.2.1 单链表的创建和遍历1.2.2 单链表的插入和删除操作 1.2.3 单链表的反转1.3 栈1.3.1 栈的实现1.3.2 栈的应用1.4 队列1.4.1 队列的实现1.4.2 队列的应用2.树2.1 二叉树的实现2.1.1 二叉树的创建和遍历2.1.2 二叉树的查找操作2.1.3 二叉树的插入和删除操作2.2 平衡二叉树2.2.1 平衡二叉树的实现2.2.2 平衡二叉树的插入和删除操作 2.3 堆2.3.1 堆的实现2.3.2 堆的操作2.4 哈夫曼树2.4.1 哈夫曼树的构建2.4.2 哈夫曼编码和解码3.图3.1 图的表示方法3.1.1 邻接矩阵3.1.2 邻接表3.2 图的遍历算法3.2.1 深度优先搜索(DFS)3.2.2 广度优先搜索(BFS)3.3 最小树3.3.1 Kruskal算法3.3.2 Prim算法3.4 最短路径3.4.1 Dijkstra算法3.4.2 Floyd算法第五章实验结果本实验通过编写相关的数据结构代码和算法,成功实现了线性表、树和图的基本功能。

经测试,各功能模块能正常运行,并能给出正确的结果。

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

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

C语言版数据结构实验报告(doc 9页)苏州科技学院数据结构(C语言版)实验报告专业班级测绘0911学号0920115130姓名朱辉实习地点C1-203指导教师史守正二、源程序及注释(打包上传):三、运行输出结果:四、调试和运行程序过程中产生的问题及采取的措施:在程序编辑的过程中,有许多地方出现不能顺序运行的,还有代码出现遗漏出错,图的遍历是重点但因为知识的残缺不能完整的编译出来,又或者编译的程序不能正确的得到结果,再通过多人合作共同讨论后得到了满意的解决。

五、对算法的程序的讨论、分析,改进设想,其它经验教训:经过这次这么复杂的程序实验,我终于发现了调用函数的巨大优越性,以前遇到都是很短的程序,感觉调用有点多余,但复杂的程序时,如果不采用调用的话,会使程序非常的乱,改程序时不知道从哪改,调用函数能够更好使程序简洁话,层次话,更加容易让人看懂这次试验的逻辑性给了我们很大启发通过本次实验让我对图有了更深刻的认识,再通过多次的更改后终于将实验做出来,在实验中也出现了许多问题,有不出结果,有不能运行的,但最终只要努力都会搞定的实验五查找一、程序设计的基本思想,原理和算法描述:实现二叉排序树上的查找、插入、删除算法。

具体实现要求:1.用二叉链表做存储结构,输入键值序列,利用查找、插入算法建立一棵二叉排序树。

2.按中序遍历这棵二叉排序树。

3.在二叉排序树上插入结点。

4.删除二叉排序树上的结点。

二、源程序及注释(打包上传):三、运行输出结果:四、调试和运行程序过程中产生的问题及采取的措施:查找是一种常用到的方法在程序中十分常见,在程序运行中。

由于对遍历了解的不深刻不能够完全领悟其中的运行原理,所以出现没有结果输出的现象。

在书中不断的了解分析下从而得到了解决,书本的知识很有作用。

五、对算法的程序的讨论、分析,改进设想,其它经验教训:经过这次这么复杂的程序实验,我终于发现了调用函数的巨大优越性,以前遇到都是很短的程序,感觉调用有点多余,但复杂的程序时,如果不采用调用的话,会使程序非常的乱,改程序时不知道从哪改,调用函数能够更好使程序简洁话,层次话,更加容易让人看懂这次试验的逻辑性给了我们很大启发,在程序不断复杂的今天只有很好了解程序的过程,把握程序中心思想才能够更好的完善研发程序,在不断的累积中达到更高的层次。

数据结构c语言实验报告

数据结构c语言实验报告

数据结构c语言实验报告数据结构C语言实验报告引言:数据结构是计算机科学中的重要概念,它是指一组数据的组织方式和存储结构,以及对这组数据进行操作的方法。

在本次实验中,我们将使用C语言来实现一些常见的数据结构,并测试其功能和性能。

一、线性表线性表是最基本的数据结构之一,它是一种有序的数据元素序列。

我们使用C语言中的数组来实现线性表,并实现了插入、删除、查找等操作。

通过实验,我们发现在插入和删除操作频繁的情况下,使用链表实现的线性表性能更好。

二、栈栈是一种特殊的线性表,它的插入和删除操作只能在同一端进行。

我们使用C语言中的数组来实现栈,并实现了入栈和出栈操作。

通过实验,我们发现栈在递归算法、表达式求值等场景中有着重要的应用。

三、队列队列也是一种特殊的线性表,它的插入操作在一端进行,删除操作在另一端进行。

我们使用C语言中的数组来实现队列,并实现了入队和出队操作。

通过实验,我们发现队列在模拟排队、调度算法等场景中有着广泛的应用。

四、二叉树二叉树是一种特殊的树形结构,每个节点最多有两个子节点。

我们使用C语言中的结构体来实现二叉树,并实现了先序、中序和后序遍历等操作。

通过实验,我们发现二叉树在搜索算法、排序算法等场景中有着重要的应用。

五、图图是一种复杂的非线性结构,它由节点和边组成。

我们使用C语言中的邻接矩阵和邻接表来实现图,并实现了深度优先搜索和广度优先搜索等操作。

通过实验,我们发现图在社交网络分析、路径规划等领域有着广泛的应用。

六、排序算法排序算法是数据结构中的重要内容,它用于将一组无序的数据按照某种规则进行排序。

我们使用C语言实现了常见的排序算法,如冒泡排序、插入排序、选择排序、快速排序等。

通过实验,我们比较了这些排序算法的性能和稳定性。

七、性能分析在实验过程中,我们使用了时间复杂度和空间复杂度来评估数据结构的性能。

时间复杂度表示算法执行所需的时间,空间复杂度表示算法执行所需的内存空间。

通过实验,我们了解了不同数据结构和算法的性能特点,为实际应用提供了参考依据。

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

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

数据结构(C语言版) 实验报告数据结构(C语言版) 实验报告1:引言1.1 问题描述在本实验中,我们需要设计一个基于C语言的数据结构,用于解决特定问题。

1.2 目的本实验的目的是通过设计和实现数据结构,加深对数据结构和C语言的理解,并应用所学的知识解决实际问题。

1.3 相关工作在这一章节中,我们将介绍与本实验相关的先前工作,并分析其优缺点,为我们的设计提供参考。

2:需求分析2.1 功能需求本节将详细描述所设计的数据结构需要实现的功能。

2.2 性能需求在这一节中,我们将明确数据结构的性能需求,例如时间复杂度和空间复杂度限制。

3:数据结构设计3.1 数据结构定义在这一节中,我们将给出所设计数据结构的定义,并详细说明每个字段的含义和作用。

3.2 数据结构操作在这一节中,我们将详细描述每个数据结构操作的实现。

这些操作包括插入,删除,查找等。

4:算法设计4.1 算法描述在这一节中,我们将给出在实现数据结构过程中使用的算法的详细描述。

我们将分析算法的时间复杂度,并讨论其优缺点。

4.2 算法优化在这一节中,我们将分析并设计优化算法,以提高数据结构的性能。

5:实验结果在这一节中,我们将给出实验结果,并分析实验数据。

我们还将展示实验中所涉及的示例输入和输出。

6:结论在这一节中,我们将总结本实验的设计和实现,并讨论所得实验结果的意义和潜在的改进方向。

7:附录本文档附带以下附件:- 代码实现:包含所设计数据结构的C语言源代码。

- 实验数据文件:包含用于测试数据结构的示例输入和输出文件。

8:法律名词及注释本文档中涉及的法律名词及注释见附件。

数据结构c语言版实验报告

数据结构c语言版实验报告

数据结构c语言版实验报告数据结构C语言版实验报告一、实验目的本次实验的目的是通过使用C语言编程,实现几种常见的数据结构,包括栈、队列和链表,并进行相关操作的实现和测试。

二、实验内容1. 栈的实现与应用栈是一种先进后出的数据结构,常用于实现递归、表达式求值和内存管理等场景。

在本次实验中,我们使用C语言实现了一个基于数组的顺序栈,并进行了以下操作的实现和测试:- 入栈(push):将元素插入到栈顶。

- 出栈(pop):将栈顶元素删除并返回。

- 获取栈顶元素(top):返回栈顶元素的值。

- 判断栈是否为空(isEmpty):判断栈是否为空栈。

2. 队列的实现与应用队列是一种先进先出的数据结构,常用于实现任务调度、消息传递和缓冲区等场景。

在本次实验中,我们使用C语言实现了一个基于数组的顺序队列,并进行了以下操作的实现和测试:- 入队(enqueue):将元素插入到队尾。

- 出队(dequeue):将队头元素删除并返回。

- 获取队头元素(front):返回队头元素的值。

- 判断队列是否为空(isEmpty):判断队列是否为空队列。

3. 链表的实现与应用链表是一种动态数据结构,常用于实现链式存储和数据的插入、删除等操作。

在本次实验中,我们使用C语言实现了一个单链表,并进行了以下操作的实现和测试:- 头插法(insertAtHead):在链表头部插入元素。

- 尾插法(insertAtTail):在链表尾部插入元素。

- 删除节点(deleteNode):删除指定节点。

- 查找节点(searchNode):查找指定节点的位置。

三、实验结果通过对栈、队列和链表的实现和测试,我们得到了以下实验结果:1. 栈的实现和操作的正确性得到了验证,栈的入栈、出栈、获取栈顶元素和判断是否为空的功能均正常运行。

2. 队列的实现和操作的正确性得到了验证,队列的入队、出队、获取队头元素和判断是否为空的功能均正常运行。

3. 链表的实现和操作的正确性得到了验证,链表的头插法、尾插法、删除节点和查找节点的功能均正常运行。

数据结构实验报告

数据结构实验报告

苏州科技学院数据结构(C语言版)实验报告专业班级地信0912学号0920209210姓名吕俊实习地点C1机房指导教师史守正实验一线性表一、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)线性表是最常用且最简单的一种数据结构。

简言之,一个线性表是n个数据元素的有限序列。

至于每个数据元素的具体含义,在不同的情况下各不相同,它可以是一个数或者一个符号,也可以是一页书,甚至其他更复杂的信息。

线性表是一个相当灵活的数据结构,它的长度可根据需要增长或者缩短,即对线性表的数据元素不仅访问,还可以进行插入和删除等。

二、源程序及注释(打包上传):三、运行输出结果:1、建立线性表2、插入元素3、删除元素4、查找元素四、调试和运行程序过程中产生的问题及采取的措施:问题:在调试过程中只要碰到了程序检查无误,却不能运行?解决:经过多次反复的检查和修改,发现是指针出了问题,最终正常运行了程序。

五、对算法的程序的讨论、分析,改进设想,其它经验教训:分析,改进设想:整个算法在运行复杂程度上还有许多需要改进,可以通过查阅资料度分段功能程序进行简化。

经验教训:上课听老师在上面说的时候自己听的懂,感觉很简单,也不记笔记,然后上机自己去做程序的时候发现自己不知道该怎么动手。

发现自己还是没有完全了解这个程序,以后要勤动手,不做语言的巨人。

实验二栈和队列一、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)栈的定义和特点定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈特点:先进后出(FILO)或后进先出(LIFO)队列的定义及特点定义:队列是限定只能在表的一端进行插入,在表的另一端进行删除的线性表。

队尾(rear)——允许插入的一端队头(front)——允许删除的一端队列特点:先进先出(FIFO)循环队列入队操作:算法说明:删除队头元素,返回其值x并修改队头指针分析:(1)在删除前应当判断队列是否空?if (q->front = q->rear ) return false;(2)删除动作分析;前面约定指针front指向队首元素的位置,故:x=q->data[ q->front ];q->front = (q->front+1)%Maxsize二、源程序及注释(打包上传):三、运行输出结果:1、建立栈:构造一个空栈,并插入元素2、入栈,插入元素3、出栈,删除元素4、取栈顶元素5、输出显示栈内元素,从栈底到栈顶四、调试和运行程序过程中产生的问题及采取的措施:问题:队列队尾指针已经移到了最后,再有元素入队就会出现溢出,而事实上此时队中并未真的“满员”。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构(C语言版) 实验报告学院计算机科学与技术专业计算机大类强化学号xxx班级xxx姓名xxx指导教师xxx实验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心得体会:本次实验使我们对链表的实质了解更加明确了,对链表的一些基本操作也更加熟练了。

相关文档
最新文档