数据结构线性表单链表的查找,插入,删除

合集下载

实验01 线性表的基本操作

实验01 线性表的基本操作

实验01 线性表的基本操作一、实验目的1. 了解线性表的结构特点及有关概念;2. 理解线性表的存储结构;3. 掌握顺序表及单链表的基本操作算法。

二、实验内容1、编写程序实现顺序表的各种基本运算:初始化、插入、删除、取表元素、求表长、输出表、销毁、判断是否为空表、查找元素。

在此基础上设计一个主程序完成如下功能:(1)初始化顺序表L;(2)依次在表尾插入a,b,c,d,e五个元素;(3)输出顺序表L;(4)输出顺序表L的长度;(5)判断顺序表L是否为空;(6)输出顺序表L的第4个元素;(7)输出元素c的位置;(8)在第3个位置上插入元素f,之后输出顺序表L;(9)删除L的第2个元素,之后输出顺序表L;(10)销毁顺序表L。

2、编写程序实现单链表的各种基本运算:初始化、插入、删除、取表元素、求表长、输出表、销毁、判断是否为空表、查找元素。

在此基础上设计一个主程序完成如下功能:(1)初始化单链表L;(2)依次在表尾插入a,b,c,d,e五个元素;(3)输出单链表L;(4)输出单链表L的长度;(5)判断单链表L是否为空;(6)输出单链表L的第4个元素;(7)输出元素c的位置;(8)在第3个位置上插入元素f,之后输出单链表L;(9)删除L的第2个元素,之后输出单链表L;(10)销毁单链表L。

三、实验要点及说明一.顺序表1.顺序表初始化:(1)为顺序表L动态分配一个预定大小的数组空间,使elem 指向这段空间的基地址。

(2)将表的当前长度设为0.2.顺序表的取值:(1)判断指定的位置序号i值是否合理(1<=i<=L.length),若不合理则返回ERROR.(2)若i值合理,则将i个数据元素L.elem[i]赋给参数e,通过e返回第i个数据元素的传值。

3.顺序表的查找:(1)从第一个元素起,依次和e相比较,若找到与e相等的元素L.elem[i],则查找成功,返回该元素的序号i+1.(2)若查遍整个顺序表都没要找到,则查找失败,返回0.4.顺序表的插入:(1)判断插入位置i是否合法(i值的合法范围是1<=i<=n+1),若不合法则返回值ERROR.(2)判断顺序表的存储空间是否已满,若满则返回值ERROR(3)将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n+1时无需移动)。

(完整版)数据结构线性表的主要程序代码

(完整版)数据结构线性表的主要程序代码

数据结构顺序表的主要代码(LIZHULIN)1./***有头结点的单链表的初始化、建立(表头插入、表尾插入)、求长度、插入、删除、输出***//***********单链表的初始化、建立、输出*****************/#include<stdio.h>#include<stdlib.h>typedef struct Lnode{ /*定义线性表的单链表存储结构*/int data;struct Lnode *next;}LinkList;/****************单链表的初始化*************************/Initlist(LinkList *L){ /*动态申请存储空间*/L = (LinkList *)malloc(sizeof(struct Lnode));/*建立头结点*/L->next = NULL;}/*************建立一个带头结点的单链表,在表尾插入***************/Create_L(LinkList *L,int n){LinkList *p,*q; int i;Initlist(L); /*单链表初始化*/q=L;printf("input the value\n");for(i = n;i>0;--i){p = (LinkList*)malloc(sizeof(struct Lnode));scanf("%d",&p->data); /*输入元素值*/q->next = p;p->next = NULL;q=p;/*插入到表尾*/}} /* Create_L *//*************建立一个带头结点的单链表,在表头插入**************Create_L(LinkList *L,int n){LinkList *p; int i;Initlist(L); /*单链表初始化/*需要注意第一个数据插入时的情况/*Insert the Firset nodep = (LinkList*)malloc(sizeof(struct Lnode));printf("input the value\n");scanf("%d",&p->data); /*输入元素值L->next = p;p->next = NULL;/*将第二个及后面的数据插入for(i = n-1;i>0;--i){p = (LinkList*)malloc(sizeof(struct Lnode));printf("input a value\n");scanf("%d",&p->data); /*输入元素值p->next = L->next;L->next = p;/*插入到表头}} /* Create_L *//*************************求单链表的长度***********************/int Length_LinkList(LinkList *L){LinkList *p;int i=0;p=L->next;while(p!=NULL){i++;p=p->next;}return i;}/*Length_LinkList*//*************************在第i个结点前插入数据x *********************/ Insert_LinkList(LinkList *L, int i, int x){LinkList *p,*s;int j=0;p=L;/*寻找第i个结点*/while(j<i-1 && p!=NULL){++j;p=p->next;}if (!p) return 0;/*如果表长小于i,则无意义*//*插入元素x */s=(LinkList *)malloc(sizeof(struct Lnode));s->data=x;s->next=p->next;p->next=s;}/*********************删除第i个元素,并用y将其值返回************************/ int Delete_LinkList(LinkList *L, int i){LinkList *p,*q;int y;int j=0;p=L;/*寻找第i个结点*/while(j<i-1 && p!=NULL){++j;p=p->next;}if (!p) return 0;/*如果表长小于i,则无意义*/q=p->next;y=q->data;p->next=q->next;free(q) ;return y;} /*Delete_LinkList*//*******************单链表值的输出****************/void display(LinkList *L) /*字母链表的输出*/{LinkList *p;p=L->next;while (p!=NULL){printf("%d ",p->data);p=p->next;}}/*************主程序**********************/ main(){LinkList *L;int len;int n=0;int x=15;int y;int i=4;L = (LinkList*)malloc(sizeof(struct Lnode));/*L->data = 0;*/L->next =NULL;printf("input the length of L ,n\n");scanf("%d",&n);printf("\n");Create_L(L,n);Insert_LinkList(L, i, x);/* y=Delete_LinkList(L,i);printf("the delete elment is y=%d\n",y);len=Length_LinkList(L);printf("the length of L is %d",len);*/display(L);getch();}2./***无头结点的单链表建立、插入、求长度、插入、删除、输出*****/#include<stdio.h>#include<stdlib.h>typedef struct Lnode{ /*定义线性表的单链表存储结构*/int data;struct Lnode *next;}LinkList;/*************Create ***************/Link_Creat(LinkList *L,int n){LinkList *q,*p;int i;printf("input the data\n");scanf("%d",&L->data);p=L;for(i=2; i<=n;i++){q=(LinkList *)malloc(sizeof(struct Lnode));scanf("%d",&q->data);p->next=q;q->next=NULL;p=q;}}/**************OutPut*********************/Link_Display(LinkList *L){LinkList *p;p=L;while(p!=NULL){printf("%d ",p->data);p=p->next;}}/***************Main()**************************/main(){LinkList *L;int n;L=(LinkList *)malloc(sizeof(struct Lnode));L->data=0;L->next=NULL;printf("Please input the length of LinkList, n\n");scanf("%d",&n);Link_Creat(L,n);Link_Display(L);getch();}3./*********顺序表的建立、查找、插入运算********/#include <stdio.h>#include <stdlib.h>typedef int datatype;#define list_maxsize 20/********* define for node struct ************/typedef struct{datatype data[list_maxsize];int length;}SqList;/********** InitList ************/void InitList(SqList *L){L->length = 0;}/*******Creat SqList********/void Create_SqList(SqList *L){int i=0;InitList(L);printf("input SqList.data\n");scanf("%d",&L->data[0]);while(L->data[i]!=-1){++i;scanf("%d",&(L->data[i]));}L->length = i;}/********* the length of SqList****************/int ListLength(SqList *L){return L->length;}/************ GetElem L->data[i]************/int GetElem(SqList *L, int i){if(i<1 || i>L->length){ printf("Position Error");return;}elsereturn L->data[i-1];}/**************** Output the SqList**************/ void Display_SqList(SqList *L){int i,n;n=ListLength(L);printf("the length is %d ",n);for(i=0;i<n;i++)printf("%d ", L->data[i]);}/****************Main()**************************/ main(){SqList *L;/*printf("input the length of SqList\n");scanf("%d",&len);*/Create_SqList(L);Display_SqList(L);getch();}4./*********顺序表的归并运算********/#include <stdio.h>#include <stdlib.h>typedef int datatype;#define list_maxsize 20/********* define for node struct ************/typedef struct{datatype data[list_maxsize];int length;}SqList;/********** InitList ************/void InitList(SqList *L){L->length = 0;}/************ Creat SqList*************/void Create_SqList(SqList *L){int i=0;InitList(L);printf("input the data of SqList\n");scanf("%d",&L->data[0]);while(L->data[i]!=-1){++i;scanf("%d",&(L->data[i]));}L->length = i;}/********* the length of SqList****************/int ListLength(SqList *L){return L->length;}/************ GetElem L->data[i]************/int GetElem(SqList *L, int i){if(i<1 || i>L->length){ printf("Getelem Position Error");return;}return L->data[i-1];}/************ Insert Operation *********/void ListInsert(SqList *L,int i, int x){SqList *q, *p;if(i<1 || i>L->length){printf("the insert position error");return ;}q = &(L->data[i-1]); /*q为插入位置*/for(p=&(L->data[L->length-1]); p>=q; --p)*(p+1) = *p;L->data[i-1] = x;++L->length;}/********* LA and LB Merged LC ***************/ void MergeList(SqList *LA,SqList *LB,SqList *LC) {int La_len,Lb_len,ai,bj;int i,j;int k;i=j=1;InitList(LC);La_len = ListLength(LA);Lb_len = ListLength(LB);LC->length = La_len+Lb_len;/*for(k=0;k<LC->length;k++)LC->data[k] = 0; */k=0;while((i<=La_len)&&(j<=Lb_len)){ai= GetElem(LA, i);bj= GetElem(LB, j);if(ai<bj){++k;ListInsert(LC,k,ai);++i;}elseif(ai==bj){++k;ListInsert(LC,k,ai);++k;ListInsert(LC,k,bj);++i;++j;}else{++k;ListInsert(LC,k,bj);++j;}}while(i<=La_len){/*Append the residual node into LA */ai= GetElem(LA, i);++i;++k;ListInsert(LC,k,ai);}while(j<=Lb_len){/*Append the residual node into LA */bj= GetElem(LB, j);++j;++k;ListInsert(LC,k,bj);}LC->length = La_len+Lb_len;}/**************** Output the SqList**************/ void Display_SqList(SqList *L){int i,n;n=ListLength(L);printf("the length is %d ",n);for(i=0;i<n;i++)printf("%d ", L->data[i]);}/****************Main()**************************/ main(){SqList *LA , *LB, *LC;Create_SqList(LA);Create_SqList(LB);MergeList(LA,LB,LC);Display_SqList(LC);getch();}5./**** 用带头结点的循环单链表解决约瑟夫问题***********/#include<stdio.h>#include<stdlib.h>typedef struct Lnode{ /*定义线性表的单链表存储结构*/int data;struct Lnode *next;}LinkList;/****************单链表的初始化*************************/Initlist(LinkList *L){ /*动态申请存储空间*/L = (LinkList *)malloc(sizeof(struct Lnode));/*建立头结点*/L->next = L;}/*************建立一个带头结点的循环单链表,数据值为1,2,3,...n,在表尾插入***************/Create_L(LinkList *L,int n){LinkList *p; int i;Initlist(L); /*单链表初始化p=L;for(i = n;i>0;--i){q = (LinkList*)malloc(sizeof(struct Lnode));q->data = i; /*输入元素值p->next =qq->next = L;/*插入到表尾}} /* Create_L *//*******************单链表值的输出****************/void display(LinkList *L) /*字母链表的输出*/{LinkList *p;p=L->next;while (p->next!=L){printf("%d ",p->data);p=p->next;}}/*************主程序**********************/ main(){LinkList *L;int n;L = (LinkList*)malloc(sizeof(struct Lnode));/*L->data = 0;*/L->next =L;printf("input the length of L ,n\n");scanf("%d",&n);printf("\n");Create_L(L,n);display(L);getch();}6./******** 无头结点的循环单链表的建立**************/#include<stdio.h>#include<stdlib.h>typedef struct Lnode{ /*定义线性表的单链表存储结构*/int data;struct Lnode *next;}LinkList;/*************Create ***************/Link_Creat(LinkList *L,int n){LinkList *q,*p;int i;printf("input the data\n");scanf("%d",&L->data);p=L;for(i=2; i<=n;i++){q=(LinkList *)malloc(sizeof(struct Lnode));scanf("%d",&q->data);p->next=q;q->next=NULL;p=q;}p->next = L;/*尾结点指向第一个结点*/}/**************OutPut*********************/Link_Display(LinkList *L){LinkList *p;p=L;printf("%d ",p->data);p=p->next;while(p->next !=L){printf("%d ",p->data);p=p->next;}}/***************Main()**************************/ main(){LinkList *L;int n;L=(LinkList *)malloc(sizeof(struct Lnode));L->data=0;L->next=NULL;printf("Please input the length of LinkList, n\n");scanf("%d",&n);Link_Creat(L,n);Link_Display(L);getch();}。

数据结构-线性表输入,输出,插入,删除,查找

数据结构-线性表输入,输出,插入,删除,查找

创建一个线性表实现输入,输出,插入,删除,定位。

(注意:不论在调用哪个函数前,都要先使L.elem=a,就是使指针elem回到数组a的首地址。

)#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量#define LISTINCREMENT 10 //线性表存储空间的分配增量#define OK 1#define ERROR 0#define OVERFLOW -2typedef int ElemType; //接下来ElemType代表的就是inttypedef int Status; //Status也代表intint i,*p,*q; //p,q都是指针类型ElemType e;typedef struct{ElemType *elem; //定义成指针类型//存储空间基址int length; //当前长度int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位) }SqList;//***********************构建空的线性表*************************// Status InitList_Sq(SqList &L) //构建一个空的线性表L{L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L.elem) exit(OVERFLOW); //存储分配失败L.length=0; //空表长度为0L.listsize=LIST_INIT_SIZE; //初始存储容量return OK;}//**************************线性表输入函数*********************//void input(SqList &L) //输入函数{scanf("%d",L.elem); //要先输入一个,不然一开始就是0,无法进行循环while(*L.elem) // 加*是因为elem是指针,加之后才代表值{L.elem++; //输入后指针后移L.length++; //表长加1scanf("%d",L.elem); //循环中也要再输入}}//**************************线性表打印函数********************//void print(SqList &L) //输出函数{int n;for(n=0;n<L.length;n++){printf("%d\t",*L.elem);L.elem++; //输出后指针后移}}//***********线性表插入函数(在第i个位置插入一个数据e)*************// Status ListInsert_Sq(SqList &L,int i,ElemType e)//插入函数{//在顺序线性表L中第i个位置之前插入新的元素e//i的合法值为1<=i<=ListLength.Sq(L)+1Status *newbase;指针类型。

线性表的存储结构定义及基本操作

线性表的存储结构定义及基本操作

一、实验目的:. 掌握线性表的逻辑特征. 掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算. 熟练掌握线性表的链式存储结构定义及基本操作. 理解循环链表和双链表的特点和基本运算. 加深对顺序存储数据结构的理解和链式存储数据结构的理解,逐步培养解决实际问题的编程能力二、实验内容:(一)基本实验内容(顺序表):建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空;1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作:. 创建一个新的顺序表,实现动态空间分配的初始化;. 根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插入),形成有序顺序表;. 根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删除指定值的所有结点(值删除);. 利用最少的空间实现顺序表元素的逆转;. 实现顺序表的各个元素的输出;. 彻底销毁顺序线性表,回收所分配的空间;. 对顺序线性表的所有元素删除,置为空表;. 返回其数据元素个数;. 按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i 个结点,查找该元素的值,对查找结果进行返回;. 按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回;. 判断顺序表中是否有元素存在,对判断结果进行返回;. 编写主程序,实现对各不同的算法调用。

2.实现要求:对顺序表的各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要从时间复杂度和空间复杂度上进行评价;. “初始化算法”的操作结果:构造一个空的顺序线性表。

对顺序表的空间进行动态管理,实现动态分配、回收和增加存储空间;. “位置插入算法”的初始条件:顺序线性表L 已存在,给定的元素位置为i,且1≤i≤ListLength(L)+1 ;操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1;. “位置删除算法”的初始条件:顺序线性表L 已存在,1≤i≤ListLength(L) ;操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1 ;. “逆转算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行交换,为了使用最少的额外空间,对顺序表的元素进行交换;. “输出算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行输出;. “销毁算法”初始条件:顺序线性表L 已存在;操作结果:销毁顺序线性表L;. “置空表算法”初始条件:顺序线性表L 已存在;操作结果:将L 重置为空表;. “求表长算法”初始条件:顺序线性表L 已存在;操作结果:返回L 中数据元素个数;. “按序号查找算法”初始条件:顺序线性表L 已存在,元素位置为i,且1≤i≤ListLength(L)操作结果:返回L 中第i 个数据元素的值. “按值查找算法”初始条件:顺序线性表L 已存在,元素值为e;操作结果:返回L 中数据元素值为e 的元素位置;. “判表空算法”初始条件:顺序线性表L 已存在;操作结果:若L 为空表,则返回TRUE,否则返回FALSE;分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。

线性表的插入和删除(数据结构)

线性表的插入和删除(数据结构)

电子信息工程学系实验报告——适用于计算机课程课程名称:Array实验项目名称:线性表的插入和删除实验时间: 2012、3、班级:计应102 姓名:学号:实验目的:熟悉掌握线性表的基本操作在顺序存储结构和链式存储结构上的实现,并熟悉其各自的优缺点及适用性。

实验环境:C—Free5.0实验内容及过程:题目1:编写程序实现下列的要求:(1) 设数据元素为整数,实现这样的线性表的顺序存储表示。

(2) 键盘输入10个数据元素,利用顺序表的基本操作,建立该表。

(3) 利用顺序表的基本操作,找出表中的最大的和最小的数据元素(用于比较的数据元素为整数)。

(4) * 若数据元素为学生成绩(含姓名、成绩等字段),重新编程,实现上面的要求。

要求尽可能少地修改前面的程序来得到新程序。

(这里用于比较的字段为分数)题目2:编写程序实现下列的要求:(1) 设学生成绩表中的数据元素为学生成绩(含姓名、成绩字段),实现这样的线性表的链式存储表示。

(2) 键盘输入若干个数据元素(用特殊数据来标记输入数据的结束),利用链表的基本操作(前插或后插算法),建立学生成绩单链表。

(3) 键盘输入关键字值x,打印出表中所有关键字值<=x的结点数据。

(用于比较的关键字字段为分数)。

(4) 输入关键字值x,删除表中所有关键字值<=x的结点。

(用于比较的关键字字段为分数)。

实验结果及分析:题目一:(4):题目二:实验心得:通过这次的实验,对线性表和单链表的创建和修改有了初步的认识,和同学的讨论互相弥补了不足,相信在未来的学习中会有更大的收获。

附录:题目一代码:#include "stdio.h"#include "conio.h"typedef int datatype;struct seqlist{int maxnum;int n;datatype *element;};typedef struct seqlist *Pseqlist;Pseqlist creatnulllist_seq(int m) /* 建立空的顺序表*/{Pseqlist p=(Pseqlist)malloc(sizeof(struct seqlist));if(p!=NULL){p->element=(datatype *)malloc(sizeof(datatype)*m);if(p->element!=NULL){p->maxnum=m;p->n=0;}else free(p);}printf("out of space");return NULL;}Pseqlist init_seq(Pseqlist p,int n) /* 初始化空的顺序表,即填充数据,顺序表的实际元素个数n 由参数提供*/{int i;printf("input the element of seqlist:");for(i=0;i<n;i++)scanf("%d",&p->element[i]);p->n=n;return(p);}int insertpost_seq(Pseqlist p,int i,datatype x) /* 在i之后插入一个元素x */{int j;if(p->n>=p->maxnum){printf("overflow");return(0);}if(i<0 || i>p->n ){printf("not exist");return(0);}for(j=p->n-1; j>=i+1; j--)p->element[j+1]=p->element[j];p->element[i+1]=x;p->n++;return(1);}void print(Pseqlist p) /* 打印顺序表中的元素*/{int i;for(i=0;i<p->n;i++)int FinMax(Pseqlist p){int max=p->element[0];int i;for(i=1;i<p->n;++i){if(max<p->element[i])max=p->element[i];}return max;}int FinMin(Pseqlist p){int min=p->element[0];int i;for(i=1;i<p->n;++i){if(min>p->element[i])min=p->element[i];}return min;}main(){Pseqlist p;int m,n,i,x,k;printf("input the size of seqlist m:"); /* 输入顺序表的最大空间m,建立空的顺序表*/ scanf("%d",&m);p=creatnulllist_seq(m);printf("input the real number of seqlist n(n<m):"); /* 输入顺序表的实际长度n,初始化顺序表*/ scanf("%d",&n);p=init_seq(p,n);/* 输出插入之前顺序表的元素*/ print(p);printf("\n");printf("input i,x:");scanf("%d%d",&i,&x); /* k的值用来表示是否插入成功*/k=insertpost_seq(p,i,x);if(k==1) print(p); /* 如果插入成功,输出插入之后顺序表的元素*/ printf("\nmax:%d,min:%d\n",FinMax(p),FinMin(p));}题目一的(4)的代码:#include "stdio.h"#include "conio.h"//typedef int datatype;typedef struct student{int score;char name[30];}datatype;struct seqlist{int maxnum;int n;datatype *element;};typedef struct seqlist *Pseqlist;Pseqlist creatnulllist_seq(int m) /* 建立空的顺序表*/{Pseqlist p=(Pseqlist)malloc(sizeof(struct seqlist));if(p!=NULL){p->element=(datatype *)malloc(sizeof(datatype)*m);if(p->element!=NULL){p->maxnum=m;p->n=0;return(p);}else free(p);}printf("out of space");return NULL;}Pseqlist init_seq(Pseqlist p,int n) /* 初始化空的顺序表,即填充数据,顺序表的实际元素个数n 由参数提供*/{int i;printf("输入10个分数:输入10个名字:");for(i=0;i<n;i++)scanf("%d%s",&p->element[i].score,p->element[i].name);return(p);}int insertpost_seq(Pseqlist p,int i,datatype x) /* 在i之后插入一个元素x */ {int j;if(p->n>=p->maxnum){printf("overflow");return(0);}if(i<0 || i>p->n ){printf("not exist");return(0);}i-=2;for(j=p->n-1; j>=i+1; j--)p->element[j+1]=p->element[j];p->element[i+1]=x;p->n++;return(1);}int FinMax(Pseqlist p){int max=p->element[0].score;int i;for(i=1;i<p->n;++i){if(max<p->element[i].score)max=p->element[i].score;}return max;}int FinMin(Pseqlist p){int min=p->element[0].score;int i;for(i=1;i<p->n;++i){if(min>p->element[i].score)min=p->element[i].score;}return min;void print(Pseqlist p) /* 打印顺序表中的元素*/{int i;for(i=0;i<p->n;i++)printf("姓名:%s 分数:%d",p->element[i].name,p->element[i].score);}main(){Pseqlist p;int m,n,i,x,k;datatype aa;printf("input the size of seqlist m:"); /* 输入顺序表的最大空间m,建立空的顺序表*/scanf("%d",&m);p=creatnulllist_seq(m);printf("input the real number of seqlist n(n<m):"); /* 输入顺序表的实际长度n,初始化顺序表*/ scanf("%d",&n);p=init_seq(p,n);/* 输出插入之前顺序表的元素*/ print(p);printf("\n");printf("input i,x.score,:");scanf("%d%d%s",&i,&aa.score,); /* k的值用来表示是否插入成功*/ k=insertpost_seq(p,i,aa);if(k==1) print(p);/* 如果插入成功,输出插入之后顺序表的元素*/printf("\n%d %d",FinMax(p),FinMin(p));printf("分别是最大的和最小的数据");getch();}题目二代码:/* 线性表的单链表表示:类型和界面函数定义*/#include <stdio.h>/* 定义链接表元素类型。

实验报告1

实验报告1

实验一创建链表和链表操作一、实验目的掌握线性表的基本操作:插入、删除、查找、以及线性表合并等操作在顺序存储结构和链式存储结构上的实现。

二、实验内容:1. 创建单链表2.在链表上进行插入、删除操作;3.设计一个程序,用两个单链表分别表示两个集合,并求出这两个集合的并集。

四、测试数据:∙(3,9,5,6,11,8);在5之前插入4,7,并删除11∙求集合{1,12,8,6,4,9}和{2,5,12,7,4}的并集五、概要设计:本操作应完成如下功能:(1)创建链表说明:分配一定的空间,根据给定的链表长度输入值,创建链表。

(2)合并链表说明:将两个链表合并为一个链表只需修改链表头、尾指针即可实现。

(3)在链表中插入值说明:将给定的值插入到指定位置上,只需修改插入位置的前后结点的指针即可。

(4)在链表中删除值说明:将指定位置的值删除,只需修改删除位置的前后结点的指针即可。

六、详细设计:源代码:#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<iostream.h>#define OK 1#define ERROR 0#define OVERFLOW 0//线性链表的存储结构,一个结点typedef struct LNode{int data; // 数据域struct LNode *next; // 指针域}LNode,*LinkList; //结点结构类型和指向结点的指针类型int TraverseList_L(LinkList L) //遍历单链表{LinkList p;p=L->next;while(p){printf("-->%d",p->data);p=p->next;}return OK;}//尾插法创建的带头结点的单链表。

void CreateList_L(LinkList &L,int &n){L=(LinkList)malloc(sizeof (LNode));//建立一个空链表L。

数据结构——链表的创建、插入、删除

数据结构——链表的创建、插入、删除
s > a a x 一dt= :
/ 令 S指 向结点的存储 内容为 x / 半 * ① s >e t p > e t 一nx=一nx : 令新创设的结点 的指针指于 P 相邻 后方 的结点 /
② P >e ts 一nx= : p之 后 ,指 于 相 邻 后 方 的结 点 /
这样一来。便实 现了于单链表中数据的后插放置 。 ①②行顺序我们 不能去忽略, 因为常常这里就是很容产生 错误的地方 , 以说 , 可 这两句顺序错误 , 插入操作便不 能实现 , 因为 a 5的地址被存储在 a 4结点的指针域中 , 不是 明确 的, 如 果我们选择②先运行 ,则 a 5的地 址将 由于 x结点的地址数据 的抹去 , 不能够指 向 a 5以及其最 后的结点了。因为这个原因 , 我们不仅仅需要知道涉及结点 的指针为 明确或者 隐含 , 并且要 谨记将隐含结点先于别的结点执行 。

麝 一
相关代码

图5
l 4~ o
计算机光盘软件 与应用
2 1 第 8期 0 2年
C m u e DS fw r n p lc t o s o p t rC o t a ea dA p i a i n 工 程 技 术
① s (t u t d o e卓 a lc (i e f s r c = sr c n d )m l o s z o (t u t


图 3
2 后 插 法 .
后插法没有前插法这么复杂 ,我们想象 ,于书 p指 向的结 点的最后放进新创设 的结 点 x ,如图 4 。 相关语 句: sr c n d p 水声 明指针 P宰 t u t L o e书 :/ / 令术 p的地址为 a : 4 s (t u t L o e木 m lo (i e f sr c n d ) :木 = s r c n d ) a lc s z o (t u t L o e ) / 令 S指于新创设 的结点 木 /

数据结构--实验报告 线性表的基本操作

数据结构--实验报告 线性表的基本操作

数据结构--实验报告线性表的基本操作数据结构--实验报告线性表的基本操作一、引言本实验报告旨在通过实际操作,掌握线性表的基本操作,包括初始化、插入、删除、查找等。

线性表是最基本的数据结构之一,对于理解和应用其他数据结构具有重要的作用。

二、实验目的1·了解线性表的定义和基本特性。

2·掌握线性表的初始化操作。

3·掌握线性表的插入和删除操作。

4·掌握线性表的查找操作。

5·通过实验巩固和加深对线性表的理解。

三、线性表的基本操作1·初始化线性表线性表的初始化是将一个线性表变量设置为空表的过程。

具体步骤如下:(1)创建一个线性表的数据结构,包括表头指针和数据元素的存储空间。

(2)将表头指针指向一个空的数据元素。

2·插入元素插入元素是向线性表中指定位置插入一个元素的操作。

具体步骤如下:(1)判断线性表是否已满,如果已满则无法插入元素。

(2)判断插入位置是否合法,如果不合法则无法插入元素。

(3)将插入位置及其后面的元素都向后移动一个位置。

(4)将待插入的元素放入插入位置。

3·删除元素删除元素是从线性表中删除指定位置的元素的操作。

具体步骤如下:(1)判断线性表是否为空,如果为空则无法删除元素。

(2)判断删除位置是否合法,如果不合法则无法删除元素。

(3)将删除位置后面的元素都向前移动一个位置。

(4)删除最后一个元素。

4·查找元素查找元素是在线性表中查找指定元素值的操作。

具体步骤如下:(1)从线性表的第一个元素开始,逐个比较每个元素的值,直到找到目标元素或遍历完整个线性表。

(2)如果找到目标元素,则返回该元素的位置。

(3)如果未找到目标元素,则返回找不到的信息。

四、实验步骤1·初始化线性表(1)定义线性表的数据结构,包括表头指针和数据元素的存储空间。

(2)将表头指针指向一个空的数据元素。

2·插入元素(1)判断线性表是否已满。

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

实验报告课程名称数据结构姓名学号专业班级指导教师目录第二章线性表的查找、插入、删除 (1)1.1顺序表的查找 (1)1.2顺序表的插入 (2)1.3顺序表的删除 (4)单链表的建立、插入、删除 (6)2.1 单链表的建立(尾插法) (6)2.2 单链表的插入 (8)2.3 单链表的删除 (10)第三章栈 (14)3.1链栈 (14)3.2 顺序栈 (16)3.3队列 (18)3.4杨辉三角 (20)第四章串 (23)4.1字符串的建立 (23)4.2顺序串的插入 (25)1.线性表的查找、插入、删除1.1顺序表的查找程序:#include <stdio.h>#include<stdlib.h>#include<malloc.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define ElemType int#define MAXSIZE 100 /*此处的宏定义常量表示线性表可能达到的最大长度*/typedef struct{ElemType elem[MAXSIZE]; /*线性表占用的数组空间*/int last; /*记录线性表中最后一个元素在数组elem[]中的位置(下标值),空表为-1*/}Seqlist;int Locate(Seqlist L,ElemType e)/*在顺序表L中查找与e相等的元素,若L。

elem[i]=e,则找到该元素,并返回i+1,若找不到,则返回-1*/{ int i=0; /*i为扫描计数器,初值为0,即从第一个元素开始比较*/while ((i<=st)&&(L.elem[i]!=e))/*顺序扫描表,直到找到值为e的元素,或扫描到表尾仍没找到*/i++;if(i<=st)return (i+1); /*若找到值为e的元素,则返回其序号*/elsereturn(-1); /*若没找到,则返回空序号*/}void main(){Seqlist l;int p,q,r;int i;printf("请输入线性标的长度:");scanf("%d",&r);st=r-1;printf("请输入线性表的各元素值:\n");for (i=0;i<=st;i++){scanf("%d",&l.elem[i]);}printf("请输入要查找的元素值:\n");scanf("%d",&q);p=Locate(l,q);if(p==-1)printf("在此线性表中没有该元素!\n");elseprintf("该素在线性表中的位置为:%d\n",p);}执行结果:错误分析:在编写过程中,在编写主函数的时候有落下未编写的,导致运行过程中不识别。

1.2顺序表的插入程序:#include <stdio.h>#include <stdlib.h>//#include <malloc.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define ElemType int#define MAXSIZE 100typedef struct{ElemType elem[MAXSIZE];int last;}SeqList;//#include "common.h"//#include "seqlist.h"int InsList(SeqList *L,int i,ElemType e) {int k;if((i<1) || (i>L->last+2)){printf("插入位置i值不合法");return(ERROR);}if(L->last>= MAXSIZE-1){printf("表已满无法插入");return(ERROR);}for(k=L->last;k>=i-1;k--)L->elem[k+1]=L->elem[k];L->elem[i-1]=e;L->last++;return(OK);}void main(){SeqList *l;int p,q,r;int i;l=(SeqList*)malloc(sizeof(SeqList));printf("请输入线性表的长度:");scanf("%d",&r);l->last = r-1;printf("请输入线性表的各元素值:\n");for(i=0; i<=l->last; i++){scanf("%d",&l->elem[i]);}printf("请输入要插入的位置:\n");scanf("%d",&p);printf("请输入要插入的元素值:\n");scanf("%d",&q);InsList(l,p,q);for(i=0; i<=l->last; i++){printf("%d ",l->elem[i]);}}执行结果:1.3顺序表的删除程序:#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define ElemType int#define MAXSIZE 100typedef struct{ElemType elem[MAXSIZE];int last;}SeqList;int DelList(SeqList *L,int i,ElemType *e) {int k;if((i<1)||(i>L->last+1)){printf("删除位置不合法!");return(ERROR);}*e = L->elem[i-1];for(k=i; i<=L->last; k++)L->elem[k-1] = L->elem[k];L->last--;return(OK);}void main(){SeqList *l;int p,r;int *q;int i;l = (SeqList*)malloc(sizeof(SeqList));q = (int*)malloc(sizeof(int));printf("请输入线性表的长度:");scanf("%d",&r);l->last = r-1;printf("请输入线性表的各元素值:\n");for(i=0; i<=l->last; i++){scanf("%d",&l->elem[i]);}printf("请输入要删除的元素位置:\n");scanf("%d",&p);DelList(l,p,q);printf("删除的元素值为:%d\n",*q);}执行结果:2.单链表的建立、插入、删除2.1 单链表的建立(尾插法)程序:#include<stdio.h>#include<stdlib.h>#define ERROR 0#define TRUE 1#define FALSE 0typedef char ElemType;typedef struct Node /*结点类型定义*/{ElemType data;struct Node * next;}Node, *LinkList; /* LinkList为结构指针类型*/void init_linklist(LinkList *l)/*对单链表进行初始化*/{*l=(LinkList)malloc(sizeof(Node));(*l)->next=NULL;}void CreateFromTail(LinkList L){Node *r, *s;char c;int flag =1; /*设置一个标志,初值为,当输入"$"时,flag为,建表结束*/r=L; /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/while(flag) /*循环输入表中元素值,将建立新结点s插入表尾*/{c=getchar();if(c!='a'){s=(Node*)malloc(sizeof(Node));s->data=c;r->next=s;r=s;}else{flag=0;r->next=NULL; /*将最后一个结点的next链域置为空,表示链表的结束*/}}}int main(){LinkList l;Node *p;init_linklist(&l);printf("用尾插法建立单链表,请输入链表数据,以a结束!\n");CreateFromTail(l);p = l->next;while(p!=NULL){printf("%c\n",p->data);p=p->next;}return 0;}执行结果:错误分析:在代码的时候忘记分号,导致运行错误;截图如下:2.2 单链表的插入程序:#include "common.h"#include "linklist.h"int InsList(LinkList L,int i,ElemType e)/*在带头结点的单链表L中第i个位置插入值为e的新结点s*/{Node *pre,*s;int k;pre=L;k=0; /*从"头"开始,查找第i-1个结点*/while(pre!=NULL&&k<i-1) /*表未查完且未查到第i-1个时重复,找到pre 指向第i-1个*/{pre=pre->next;k=k+1;} /*查找第i-1结点*/if(!pre) /*如当前位置pre为空表已找完还未数到第i个,说明插入位置不合理*/{printf("插入位置不合理!");return ERROR;}s=(Node*)malloc(sizeof(Node)); /*申请一个新的结点S */s->data=e; /*值e置入s的数据域*/s->next=pre->next; /*修改指针,完成插入操作*/pre->next=s;return OK;}void main(){LinkList l;Node *p;int flag=0;int i;char c;init_linklist(&l);printf("请输入链表数据,以$结束!\n");CreateFromTail(l);p = l->next;while(p!=NULL){printf("%c\n",p->data);p=p->next;}printf("请输入插入的位置和元素:\n");scanf("%d,%c",&i,&c);printf("%c\n",c);flag=InsList(l, i, c);if(flag)printf("插入操作成功!\n");elseprintf("插入操作失败!\n");p = l->next;while(p!=NULL){printf("%c\n",p->data);p=p->next;}}执行结果:2.3 单链表的删除程序:#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef char ElemType;typedef struct Node /*结点类型定义*/{ElemType data;struct Node * next;}Node, *LinkList; /* LinkList为结构指针类型*/void init_linklist(LinkList *l)/*对单链表进行初始化*/ {*l=(LinkList)malloc(sizeof(Node));(*l)->next=NULL;}void CreateFromTail(LinkList L){Node *r, *s;char c;int flag =1; /*设置一个标志,初值为1,当输入"$"时,flag为0,建表结束*/r=L; /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/while(flag) /*循环输入表中元素值,将建立新结点s插入表尾*/{c=getchar();if(c!='$'){s=(Node*)malloc(sizeof(Node ));s->data=c;r->next=s;r=s;}else{flag=0;r->next=NULL; /*将最后一个结点的next链域置为空,表示链表的结束*/}}}int DelList(LinkList L,int i,ElemType *e)/*在带头结点的单链表L中删除第i个元素,并将删除的元素保存到变量*e中*/{Node *pre,*r;int k;pre=L;k=0;while(pre->next!=NULL && k<i-1) /*寻找被删除结点i的前驱结点i-1使p 指向它*/{pre=pre->next;k=k+1;} /*查找第i-1个结点*/if(!(pre->next)) /* 即while循环是因为p->next=NULL或i<1而跳出的,而是因为没有找到合法的前驱位置,说明删除位置i不合法。

相关文档
最新文档