数据结构实验二(单链表基本操作)题目和源程序

合集下载

单链表的基本操作实验报告

单链表的基本操作实验报告

单链表的基本操作实验报告单链表的基本操作实验报告引言:单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

在本次实验中,我们将学习和实践单链表的基本操作,包括创建链表、插入节点、删除节点以及遍历链表等。

一、实验目的本次实验的主要目的是掌握单链表的基本操作,包括链表的创建、插入节点、删除节点和遍历链表。

通过实践操作,加深对单链表的理解,并掌握如何应用单链表解决实际问题。

二、实验过程1. 创建链表首先,我们需要创建一个空链表。

链表可以通过一个头节点来表示,头节点不存储数据,只用于标识链表的起始位置。

我们可以定义一个指针变量head,将其指向头节点。

2. 插入节点在链表中插入节点是常见的操作。

我们可以选择在链表的头部、尾部或者指定位置插入节点。

插入节点的过程可以分为以下几个步骤:a. 创建一个新节点,并为其赋值;b. 找到要插入位置的前一个节点;c. 将新节点的指针指向前一个节点的下一个节点;d. 将前一个节点的指针指向新节点。

3. 删除节点删除节点是另一个常见的操作。

我们可以选择删除链表的头节点、尾节点或者指定位置的节点。

删除节点的过程可以分为以下几个步骤:a. 找到要删除节点的前一个节点;b. 将前一个节点的指针指向要删除节点的下一个节点;c. 释放要删除节点的内存空间。

4. 遍历链表遍历链表是为了查看链表中的元素。

我们可以从头节点开始,依次访问每个节点,并输出节点的值。

三、实验结果在本次实验中,我们成功完成了单链表的基本操作。

通过创建链表、插入节点、删除节点和遍历链表等操作,我们可以方便地对链表进行增删改查操作。

四、实验总结通过本次实验,我们对单链表的基本操作有了更深入的了解。

单链表是一种非常重要的数据结构,广泛应用于各个领域。

掌握了单链表的基本操作,我们可以更好地解决实际问题,并且为以后学习更复杂的数据结构打下坚实的基础。

在实验过程中,我们还发现了一些问题和不足之处。

数据结构-单链表基本操作实现(含全部代码)

数据结构-单链表基本操作实现(含全部代码)

数据结构-单链表基本操作实现(含全部代码)今天是单链表的实现,主要实现函数如下:InitList(LinkList &L) 参数:单链表L 功能:初始化时间复杂度 O(1)ListLength(LinkList L) 参数:单链表L 功能:获得单链表长度时间复杂度O(n)ListInsert(LinkList &L,int i,ElemType e) 参数:单链表L,位置i,元素e 功能:位置i后插时间复杂度O(n)[加⼊了查找]若已知指针p指向的后插 O(1)ListDelete(LinkList &L,int i) 参数:单链表L,位置i 功能:删除位置i元素时间复杂度O(n)[加⼊了查找]若已知p指针指向的删除最好是O(1),因为可以与后继结点交换数据域,然后删除后继结点。

最坏是O(n),即从头查找p之前的结点,然后删除p所指结点LocateElem(LinkList L,ElemType e) 参数:单链表L,元素e 功能:查找第⼀个等于e的元素,返回指针时间复杂度O(n)代码:/*Project: single linkeed list (数据结构单链表)Date: 2018/09/14Author: Frank YuInitList(LinkList &L) 参数:单链表L 功能:初始化时间复杂度 O(1)ListLength(LinkList L) 参数:单链表L 功能:获得单链表长度时间复杂度O(n)ListInsert(LinkList &L,int i,ElemType e) 参数:单链表L,位置i,元素e 功能:位置i后插时间复杂度O(n)[加⼊了查找]若已知指针p指向的后插 O(1)ListDelete(LinkList &L,int i) 参数:单链表L,位置i 功能:删除位置i元素时间复杂度O(n)[加⼊了查找]若已知p指针指向的删除最好是O(1),因为可以与后继结点交换数据域,然后删除后继结点。

数据结构实验二(单链表基本操作)题目和源程序

数据结构实验二(单链表基本操作)题目和源程序

数据结构实验二(单链表基本操作)题目和源程序实验2:单链表基本操作一、实验目的1.学会定义单链表的结点类型,实现对单链表的一些基本操作和具体的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。

2.掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。

二、实验要求1.预习C语言中结构体的定义与基本操作方法。

2.对单链表的每个基本操作用单独的函数实现。

3.编写完整程序完成下面的实验内容并上机运行。

4.整理并上交实验报告。

三、实验内容1.编写程序完成单链表的下列基本操作:(1)初始化单链表La。

(2)在La中第i个元素之前插入一个新结点。

(3)删除La中的第i个元素结点。

(4)在La中查找某结点并返回其位置。

(5)打印输出La中的结点元素值。

2 .构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、Lb合并成一个有序单链表Lc。

合并思想是:程序需要3个指针:pa、pb、pc,其中pa,pb分别指向La表与Lb表中当前待比较插入的结点,pc 指向Lc表中当前最后一个结点。

依次扫描La和Lb中的元素,比较当前元素的值,将较小者链接到*pc 之后,如此重复直到La或Lb结束为止,再将另一个链表余下的内容链接到pc所指的结点之后。

3.构造一个单链表L,其头结点指针为head,编写程序实现将L 逆置。

(即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。

)四、思考与提高1.如果上面实验内容2中合并的表内不允许有重复的数据该如何操作?2.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb中只含La表中奇数结点,Lc中含有La表的偶数结点?/*----------------------------------------* 02_单链表.cpp -- 单链表基本操作* 对单链表的每个基本操作都用单独的函数来实现* 水上飘2009年写----------------------------------------*/// ds02.cpp : 定义控制台应用程序的入口点。

链表基本操作实验报告

链表基本操作实验报告
void LinkedListInsert(LinkedList L,int i,ElemType x) {LinkedList p,s; int j; j=1;p=L;
while(p&&j<i) {p=p->next;j++;} if(p==NULL||j>i)
printf("插入位置不正确\n"); else{s=(LNode *)malloc(sizeof(LNode));
{printf("%d ",p->data); p=p->next;} } printf("\n"); }
int LinkedListLength (LinkedList L) {LinkedList p;
int j; p=L->next; j=0; while(p!=NULL)
{j++;p=p->next;} return j; }
8.向链表中插入元素
插入元素之后的链表 9.从链表中删除元素
删除位置为 6 的元素(是 3)
10.清空单链表
五、 实验体会
经过这次单链表基本操作实验,自己的编程能力有了进一步的提高,认识到自 己以前在思考一个问题上思路不够开阔,不能灵活的表达出自己的想法,虽然在 打完源代码之后出现了一些错误,但是经过认真查找、修改,最终将错误一一修 正,主要是在写算法分析的时候出现了障碍,经过从网上查找资料,自己也对程 序做了仔细的分析,对单链表创建、插入、删除算法画了详细的 N-S 流程图。
r=L; r 指向头结点
使用 malloc 函数动态分配存储空间,指针 p 指向新开辟的结点,并将元素存
放到新开辟结点的数据域,

数据结构-实验2-链表的基本操作

数据结构-实验2-链表的基本操作

实验2链表的基本操作一、需求分析1,初始化链表2,调用插入函数建立一个链表3,链表的插入和删除4,链表元素的查找4,将链表分为奇链表和偶链表5,链表的逆置二、概要设计1.基础题1)编写链表基本操作函数typedefstruct list{Int data;Struct list* next}LIST;LIST* InitList() //初始化LIST* InsertList(LIST * L,int item,int re) //向链表指定位置插入元素LIST* InsertOrderList(LIST *L,int item) //向有序链表指定位置插入元素void FindList(LIST*L, int item)//查找链表中的元素void display(LIST *L)//显示链表void divide(LIST* La, LIST *Lb)//拆分链表LIST * turn(LIST *L)//转置链表2)调用上述函数实现下列操作,操作步骤如下。

A.初始化链表B.调用插入函数建立一个链表C.在链表中寻找指定的元素D.在链表中删除指定值的元素E.遍历并输出链表注意每完成一个步骤,必须及时输出顺序表元素,便于观察操作结果2.提高题a)将一个首结点指针为a的单链表A分解成两个单链表A和B,其首结点指针分别为a,b,使得链表A中含有原链表A中序号为奇数的元素,而链表B中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。

解题思路将单链表A中含有序号为偶数的元素删除,并在删除时把这些结点链接起来构成单链表B即可。

b)将链接存储线性表逆置,即最后一个结点变成第一个结点原来倒数第二个结点变成第二个结点,如此等等。

解题思路依次遍历源链表,将每个元素依次赋给一个新链表并将新链表从后到前连接。

3.主函数void main(){LIST *L1,*L2,*L3;int i;L1=InitList();printf("创建链表L1:\n");for(i=1;i<=5;i++){L1=InsertList(L1,i*2,i);}display(L1);for(i=1;i<=9;i+=4){printf("在L1的%d位置插入3:\n",i);L1=InsertList(L1,3,i);display(L1);}//有序表L2 = InitList();printf("\n有序表实验:\n");printf("创建链表L2:\n");for (i = 1; i <= 5; i++){L2 = InsertList(L2, i * 2, i); }display(L2);for (i = 1; i <= 13; i +=6 ){printf("插入%d:\n",i);L2 = InsertOrderList(L2,i);display(L2);}//删除元素实验printf("\n删除元素实验:\n"); printf("L2插入1:\n", i);L2 = InsertList(L2,1,1);display(L2);for (i = 1; i < 12; i += 5){printf("删除L2中%d\n",i);L2 = DeleteList(L2, i);display(L2);}//查找printf("\n查找元素实验:\n"); printf("查找L2中%d\n", 13); FindList(L2,13);printf("查找L2中%d\n", 6); FindList(L2, 6);//分解printf("\n分解实验:\n");printf("L2:\n");display(L2);L3 = InitList();printf("将L2偶序数拆分到L3\n"); divide(L2,L3);printf("L2:\n");display(L2);printf("L3:\n");display(L3);printf("\n逆序实验:\n");printf("L2:\n");display(L2);L2 = turn(L2);printf("转置L2:\n");display(L2);}三、详细分析插入实验,函数能够在链表前、中、后插入元素,并判断插入位置是否超过链表长度,若超过则接入链尾。

实验二 单链表基本操作

实验二  单链表基本操作

实验二单链表基本操作一、实验目的1.掌握握单链表的基本操作:新建、插入、删除、查找等运算。

二、实验要求1.认真阅读和掌握本实验的程序。

2.上机运行本程序。

3.保存和打印出程序的运行结果,并结合程序中的问题进行分析。

三、实验内容单链表基本操作的实现,这个程序中演示了单链表的创建、插入、删除和查找。

程序如下:#include<malloc.h>typedef struct node{int data;struct node *next;} NODE;/******************************************/NODE *Create()//问题1:该函数创建的带头结点的单链表,还是不带头结点的单链表?{NODE *p,*head;int x;head=(NODE *)malloc(sizeof(NODE));head->next=NULL;printf("Input data,-1 to End!\n");scanf("%d",&x);while(x!=-1){p=(NODE *)malloc(sizeof(NODE));p->data=x;p->next=head->next;head->next=p;scanf("%d",&x);}return(head);}/******************************************/void Output(NODE *head){NODE *p;p=head;printf("Begin to dump the LinkList...\n");while(p->next!=NULL){printf("->%d",p->next->data);p=p->next;}printf("\nThe LinkList ended!\n");}/******************************************/int Listlen(NODE *head){int i=0;NODE *p=head;while(p->next!=NULL){i++;p=p->next;}return(i);}/******************************************/int Get(NODE *head,int i)//问题2:将该函数修改成返回第i个元素的指针,若不存在,返回空{int j=0;NODE *p=head;while(p->next&&j<i){j++;p=p->next;}if(!p->next||j>i) return(0);else return(p->data);}/******************************************/void Del(NODE *head,int i){NODE *p=head;int j=0;while(p->next&&j<i-1){j++;p=p->next;}if(!p->next||j>i-1) printf("the position is wrong\n");elsep->next=p->next->next;}/******************************************/void Ins(NODE *head,int i,int e){NODE *p=head,*q;int j=0;while(p->next&&j<i-1){j++;p=p->next;}if(!p->next&&j>i-1) printf("Wrong position\n" );else{q=(NODE *)malloc(sizeof(NODE));q->data=e;q->next=p->next;p->next=q;}}/******************************************/main(){NODE *head;int length;int i,element;head=Create();Output(head);//以下函数调用(求长度、插入、删除、查找)能否改成菜单形式?如何改?length=Listlen(head);printf("the length of the link is %d\n",length);printf("input the order :\n");scanf("%d",&i);element=Get(head,i);printf("the element of the order is %d\n",element);printf("input the del position \n");scanf("%d",&i);Del(head,i);Output(head);printf("Input the insert posion and element:\n");scanf("%d%d",&i,&element);Ins(head,i,element);Output(head);}}。

实验报告二——单链表

实验报告二——单链表
三、源程序及注释:
#include <stdio.h>
#include <stdlib.h>
//单链表的定义:
typedef int DataType;//DataType可以是任何相应的数据类型如int, float或char
typedef struct node//结点类型定义
{DataType data;//结点的数据域
struct node *next;//结点的指针域
}ListNode;
typedef ListNode *LinkList;
int a[10];
void main()
{
int i;
DataType key;
DataType x;
LinkList head;
ListNode *p;
LinkList CreateList(void);//单链表的建立
从键盘输入2个整数一个表示欲插入的位置i另一个表示欲插入的数值x从键盘输入1个整数表示欲删除结点的位巻输出单链表所有结点值观链表中含有原链表中序号为奇数的元链表中含有原链表中序号为偶数的元素且保持原来的相对顺序分别输出单链和单链表b的所有结点值观察输出结果
《数据
实验二—单链表
分校:上海第二工业大学
班级:09安全01
p->next=s;
}
//单链表的删除:
void DeleteList(LinkList head,int i)
{
ListNode *p,*r;
int j;
p=head;j=1;
while(p&&j<i-1)
{
p=p->next;
j++;

实验二

实验二

实验二、链表基本操作
一、实验目的
1.掌握链表的概念,学会对链表进行操作。

2.加深对链式存储结构的理解,逐步培养解决实际问题的能力。

二、实验内容
(1)编写链表基本操作函数
●创建一个包含n个结点的单链表,要求返回头指针;
CreateList_L(LinkList &L,int n)
●在单链表中数据元素值为a的结点前插入值为b的结
点,要求如果值为a的结点不存在,则插在表尾;
InsertList_L(LinkList &L, char a,char b)
●在单链表中删除数据元素值为c的结点,要求如果存
在,则返回1,否则返回0;
DeleteList_L(LinkList &L,char c)
注意:每完成一个步骤,必须及时输出链表元素,便于观察操作结果。

(2)用主函数调用上述函数,实现相应功能。

三、实验要求
1.C完成算法设计和程序设计并上机调试通过。

2.撰写实验报告,提供实验结果和数据。

3.分析算法,简要给出算法设计小结和心得。

四、程序运行情况
写出输入数据及运行结果五、源程序清单。

单链表的基本操作

单链表的基本操作

实验二:单链表的基本操作编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本操作。

(1)建立一个带头结点的单链表。

(2)计算单链表的长度,然后输出单链表。

(3)查找值为x的直接前驱结点q。

(4)删除值为x的结点。

(5)把单向链表中元素逆置(不允许申请新的结点空间)。

(6)已知单链表中元素递增有序,请写出一个高效的算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素),同时释放被删结点空间,并分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,他们的值可以和表中的元素相同,也可以不同)。

(7)同(6)的条件,试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间,并分析你的算法时间复杂度。

(8)利用(1)建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。

(9)在主函数中设计一个简单的菜单,分别测试上述算法。

# include <stdio.h># include <stdlib.h>typedef struct node{int data;struct node * next;}Lnode, * LinkList;int m=sizeof(Lnode);//建立新的链表void Bulid_List(LinkList root){int num;LinkList s,p;s=root->next;int n;printf("请输入新建链表的长度n数据:\n"); scanf("%d",&n);printf("请依次建立链表:");for(int i=0;i<n;i++){scanf("%d",&num);s->data=num;p=(LinkList)malloc(m);s->next=p;s=p;s->next=NULL;}printf("链表已建立!\n");}//对链表的输出,包括长度和元素void OutPut_list(LinkList root) {int len=0;LinkList s;s=root->next;if(s->next==NULL)printf("单链表无数据,请先新建单链表。

数据结构实验指导书——单链表的基本操作

数据结构实验指导书——单链表的基本操作
void MergeAscend_Linklist(LinkList La, LinkList Lb, LinkList &Lc);/*两个非递减有序单链表La和Lb合并成一个非递减有序链表Lc*/
void Split_Linklist(LinkList La, LinkList &Lb);/*链表La按值分解成两个链表,La全部为奇数,Lb全部为偶数*/
printf("\t\t\t4.链表逆置\n");
printf("\t\t\t5.删除偶数节点\n");
printf("\t\t\t6.生成值有序单链表\n");
printf("\t\t\t7.合并生成降序链表\n");
printf("\t\t\t8.合并生成升序链表\n");
printf("\t\t\t9.分解链表\n");
实验说明:
1.类型定义
typedefintElemType; //元素类型
typedef structnode
{
ElemType data;
structnode *next;
}LinkNode, *LinkList;
2.为了算法实现简单,建议采用带头结点的单链表。
注意问题:
1.重点理解链式存储的特点及指针的含义。
Status Insert_Linklist(LinkList L, int x);/*在有序单链表L中插入元素x,链表仍然有序*/
Status CreatOrder_Linklist(LinkList &L);/*创建非递减有序单链表*/
void MergeDescend_Linklist(LinkList La, LinkList Lb, LinkList &Lc);/*两个非递减有序单链表La和Lb合并成一个非递增有序链表Lc*/

数据结构(C语言)单链表的基本操作

数据结构(C语言)单链表的基本操作

实验名称:实验一单链表的基本操作实验目的熟练掌握线性表两类存储结构的描述方法。

实验内容从键盘读入若干个整数,建一个整数单链表,并完成下列操作:(1)打印该链表;(2)在链表中插入一个结点,结点的数据域从键盘读入,打印该链表;(3)在链表中删除一个结点,被删结点的位置从键盘读入,打印该链表;(4)在链表中做查找:从键盘读入要查找的整数,将该整数在链表中的位置打印出来,若要查找的整数不在链表中,返回一个信息。

算法设计分析(一)数据结构的定义单链表存储结构定义为:struct Node;typedef struct Node * pnode;struct Node {int info;pnode link;};typedef struct Node * LinkList;(二)总体设计程序由主函数、创建单链表函数、链表长度函数、链表打印函数、插入正整数函数、删除函数、查询函数组成。

其功能描述如下:(1)主函数:调用各个函数以实现相应功能int main(void) //主函数{printf("单链表的基本操作实验:\n");struct list *pnode;pnode = creat(); //创建print(pnode); //输出insert(pnode); //插入print(pnode); //输出_delete(pnode); //删除print(pnode); //输出_located(pnode); //查找print(pnode); //输出return 0 ;}(三)各函数的详细设计:Function1: struct list *creat()//创建链表;(1):申请表头节点空间(2):输入-1结束输入;(3):结点的数据域从键盘读入;Function2:void print(struct list *pnode)//打印链表;(1):利用while循环输出结点的数据域;Function3:void insert(struct list *pnode)//插入;(1):定义一个整型变量flag 记录当前指定插入的位置;(2):利用if条件判断念输入的位置是否有效;//If(position <=0||position>length(pnode))//当输入的位置小于0或者大于链表的长度时,继续输入,直到输入到正确的值为止;(3):申请一个结点空间(为即将插入的节点);(4):用q->info 记录插入节点的数据域;(5):用while(flag!=position)判断插入的位置;(6):if(t == pnode->next) 判断插入的位置是否为单链表头结点的后面;如果是,直接用q->next = pnode->next;pnode->next = q;return ;插入结点;Function4:void _delete(struct list *pnode)//删除;(1):用if(position<=0||position>length(pnode)) 判断输入删除的位置是否在允许的范围<0或>点链表的总长度,则重新输入;(2):while(flag!=position&&p->next!=NULL) 找到需要删除的位置;(3):找到要删除的结点后,把要删除的结点架空,即可删除该结点;Fubction5:void _located(struct list *pnode)//查询位置上的数;Function6:void _located(struct list *pnode)//查询数值所在表的位置;(1):找到要查询数值的位置while(flag!=number){p=p->next;flag=p->info;position++;}(2):若未找到相关数值,则返回not found!if(!p){printf("not found");}实验测试结果及结果分析(一)测试结果(二)结果分析(1)单链表:1 2 3 4 5 6(2)输入插入的位置为:9,显示无效插入位置(3)重新输入插入位置3,输入插入值:7,则返回单链表,1 2 7 3 4 5 6(4)输入删除的位置:8,显示无效删除位置(5)从新输入删除位置:4;则返回单链表1 2 7 4 5 6(5)输入查询数值:3;则返回该数值在单链表中的位置:7实验总结通过本次的实验我对单链表有了更加深刻的了解,对单链表的删除,插入,打印,查找,等基本的操作有基本的掌握。

《数据结构》实验指导实验二单链表的存储及操作

《数据结构》实验指导实验二单链表的存储及操作

《数据结构》实验指导实验二:单链表的存储及操作一、实验目的1、掌握单链表抽象数据类型的定义。

2、掌握单链表的存储实现。

3、掌握单链表的操作算法实现。

4、了解单链表的应用。

二、实验学时2学时三、实验类型验证性实验四、实验需求1、硬件每位学生配备计算机一台;2、软件Windows XP/ Windows 7 操作系统;开发工具软件:Microsoft Visual Studio 2010。

五、实验理论与预备知识1、数据结构的基本概念2、顺序存储结构的特点3、线性表的特点和基本运算4、线性表顺序存储结构下的操作算法六、实验任务1、单链表抽象数据类型的代码实现2、编写应用程序,用相关数据验证运算算法七、实验内容及步骤1、任务一:有一个单链表对象L,设计一个算法查找最后一个值为x 的结点的逻辑序号。

并分析算法的时间和空间复杂度。

实验步骤: (1)启动Visual Studio 2010,创立窗体应用程序。

(2) 增加单链表类,代码参考如下:public class LinkList(public string data; public LinkList next;}; class LinkListClasspublic LinkList head = new LinkList();〃单链表头结点//-单链表的基本运算算法public void CrcatcListF(string[] split) 〃头插法建立单链表 {LinkList s;int i;=null;〃将头结点的next 字段置为null for (i = 0; i < h; i++)〃循环建立数据结点{s = new LinkList();s.data = split[i];〃创立数据结点ss.next =; 〃将s 结点插入到开始结点之HU,头结点之后public void CrcatcListR(string[] split) 〃尾插法建立单链表{LinkList s, r;int i;r = head;//r 始终指向尾结点,开始时指向头结点for (i = 0; i < h; i++) 〃循环建立数据结点{s = new LinkList();s.data = splitfi];〃创立数据结点s r.next = s;〃将s 结点插入r 结点之后r.next = null;〃将尾结点的next 字段置为null〃定义单链表结点类〃存放数据元素//指向下一个结点的字段string str = LinkList p; P =;//p 指向开始结点if (p == null) str ="空串"; while (p != null)//p 不为null,输出p 结点的data 字段str += p.data + " p =p.next; 〃p 移向下一个结点 return sir;1public int ListLength() 〃求单链表数据结点个数int n = 0;LinkList p; p = head; //p 指向头结点,n 置为0(即头结点的序号为0)while (p.next != null) (n++;p = p.next; }return (n);〃循环结束,p 指向尾结点,其序号n 为结点个数public bool GetElem(int i, ref string e) 〃求单链表中某个数据元素值 {intj = O;LinkList p;p = head; while (j < i && p != null) //p 指向头结点,j 置为0(即头结点的序号为0) 〃找第i 个结点pj++; p = p.next;}if (p == null) return false; 〃不存在第i 个数据结点,返回falseelse//存在第i 个数据结点,返回true c = p.data; return true;public int LocateElcm(string c)int i= 1;LinkList p;p = ;〃p 指向开始结点,i 置为1(即开始结点的序号为1)while (p != null && p.data != e) 〃查找data 值为e 的结点,其序号为i {p = p.next; i++; }if (p == null)//不存在元素值为e 的结点,返回0return (0);public stringDispList()〃将单链表所有结点值构成一个字符串返同//按元素值查找else〃存在元素值为e的结点,返回其逻辑序号ireturn (i);} _public bool Listlnsert(int i, string e) //插入数据元素{ int j = 0;LinkList s, p;if(i< 1)//i<l 时i 错误,返回falsereturn false;p = head;//p指向头结点,j置为0(即头结点的序号为0) while (j < i - 1 && p != null)〃查找第i-1 个结点{j++;p = p.next;}if(p ==null)〃未找到第i-l个结点,返回falsereturn false;else〃找到第i-l个结点p,插入新结点并返回true(s = new LinkList();s.data = e;〃创立新结点s,其data字段置为es.ncxt = p.next;〃将s结点插入到p结点之后p.next = s;return true;}}public bool ListDele(e(inl i, ref string e) 〃删除数据元素{ int j = 0;LinkList q, p;if (i < 1)〃ivl 时i 错误,返回falsereturn false;p = head;//p指向头结点j置为0(即头结点的序号为0) while (j < i - 1 && p != null)//查找第i-l 个结点j++;public int Findlast(LinkListClass L. stringx)LinkList p = L.; inti = O,j = i; while (p != null)i++;if (p.data == x) j = i ;p = p.next; return j;}(3)设计窗体,界面参考如下:p =p.ncxt;if (p == null) return false; else 〃未找到第i-1个结点,返回fa lse〃找到第i-1个结点p q = p.next; if (q == null) return false; c = q.data; p.next= q.next;q = null; return true; 〃q 指向第i 个结点〃假设不存在第i 个结点,返回false〃从单链表中删除q 结点〃释放q 结点〃返回(rue 表示成功删除第i 个结点(4) 编写窗体中按钮等控件的代码,调用单链表类,参考如下:LinkListClass L = new LinkListClassO;private〃单链表Lvoid Forml_Load(object sender, Event Args e)(=”2,3,1,5,6,2,3,8”;}private void buttonl_Click(object sender, Event Args e)(string str = .Trini();if (str ===”操作提示:必须输入元素”;else{string[] split = (new Char[] {'});L.CreateListR(split);ed = false;ed = true;=”操作提示:成功创立单链表”;}}private void button2_Click(object sender, Event Args e)(int i;string elem;elem =;i = L.Findlast(L, elem);if(i == 0)=”操作提示:在单链表中没有找到该元素”;else=i.ToStringO;=”操作提示:在单链表中找到该元素”;(5)选择【调试】—►【开始执行(不调试)】命令或按【CtH+F5】组合键运行程序,并观察运行情况。

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

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

一、实验目的二、实验内容和要求三、源代码1)顺序表的代码2)单链表的代码四、测试结果1)顺序表的测试结果2)单链表的测试结果五、心得体会实验一线性表的基本操作及其应用一、实验目的1、帮助读者复习C++语言程序设计中的知识。

2、熟悉线性表的逻辑结构。

3、熟悉线性表的基本运算在两种存储结构上的实现。

4、掌握顺序表的存储结构形式及其描述和基本运算的实现。

5、熟练掌握动态链表结构及有关算法的设计二、实验内容题目一:顺序表的基本操作[问题描述]实现顺序表的建立、求长度,取元素、修改元素、插入、删除等顺序表的基本操作。

[基本要求](1)依次从键盘读入数据,建立带头结点的顺序表;(2)输出顺序表中的数据元素(3)求顺序表的长度;(4)根据指定条件能够取元素和修改元素;(5)实现在指定位置插入和删除元素的功能。

(6)根据算法,将两个有序的顺序表合并成一个有序顺序表。

[测试数据] 由学生任意指定。

题目二:单链表的基本操作[问题描述]实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的基本操作。

[基本要求](1)依次从键盘读入数据,建立带头结点的单链表;(2)输出单链表中的数据元素(3)求单链表的长度;(4)根据指定条件能够取元素和修改元素;(5)实现在指定位置插入和删除元素的功能。

(6)根据算法,将两个有序的单链表合并成一个有序单链表。

[测试数据]由学生任意指定。

三、源代码(一)顺序表的基本操作#include<iostream>using namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef int ElemType;#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct { //结构体ElemType *elem;int length;int listsize;}SqList;SqList Lx;Status InitList_Sq(SqList &L) //分配空间{ L.elem=new ElemType[LIST_INIT_SIZE];if(!L.elem)exit(OVERFLOW);L.length =0;L.listsize=LIST_INIT_SIZE;return OK;}Status ListInsert(SqList &L,int i,ElemType e) //插入新元素{ int *q,*p;ElemType *newbase;if(i<1 || i>L.length+1) return ERROR;if(L.length>=L.listsize){ newbase=new ElemType[L.listsize+LISTINCREMENT];if(!newbase) exit(OVERFLOW);L.elem=newbase;L.listsize+=LISTINCREMENT;}q=&(L.elem[i-1]);for (p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;*q=e;++L.length;return OK;}Status Listlength(SqList L) //长度{ int *p=L.elem; //判断线形表是否存在while(p){ return (L.length); }}Status GetElem(SqList L, int i,ElemType &e) //取元素{ if(i<1 || i>L.length)return ERROR;else{ e=L.elem[i-1];return e;}}void MergeList(SqList La,SqList Lb,SqList &Lc) //合并{ ElemType ai,bj;InitList_Sq(Lc);int i=1,j=1,k=0;int La_len,Lb_len;La_len=Listlength(La);Lb_len=Listlength(Lb);while((i<=La_len)&&(j<=Lb_len)){ GetElem(La,i,ai);GetElem(Lb,j,bj);if(ai<=bj){ ListInsert(Lc,++k,ai);++i; }else{ ListInsert(Lc,++k,bj);++j; }}while(i<=La_len){ GetElem(La,i++,ai);ListInsert(Lc,++k,ai);}while(j<=Lb_len){ GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);}}void show(SqList L,int i) //显示{ int j;ElemType k;cout<<"顺序表显示如下:"<<endl;for(j=0;j<i-1;j++){ k=L.elem[j];cout<<k<<"->"; }if(j==i-1 && i>0){ k=L.elem[j]; cout<<k; }cout<<endl;}void create(SqList &L,int n) //输入元素{ int e;for(int i=0;i<n;i++)L.elem[i]=e;L.length=i+1; }}Status ListDelete_Sq(SqList &L,int i,ElemType &e) //删除{ ElemType *p, *q;if(i<1 || i>L.length) return ERROR;p=&(L.elem[i-1]);e=*p;q=L.elem+L.length-1;for(++p;p<=q;++p) *(p-1)=*p;--L.length;return OK;}Status Listxiugei(SqList &L,int i,ElemType &e) //修改{ if(i<1 || i>L.length)return ERROR;else{ L.elem[i-1]=e;return OK; }}void shuru(SqList &L1) //顺序表的创建{ int a;InitList_Sq(L1);cout<<"请输入顺序表的长度:";cin>>a;cout<<"请输入顺序表的元素(共"<<a<<"个)"<<endl;create(L1,a);show(L1,a);}void chaxun(SqList &L1) //取第i个位置的元素{ int j;ElemType e1;cout<<"请选择所要取出元素的位置:";while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要取出元素的位置:";cin>>j; }GetElem(L1,j,e1);cout<<"取出的元素为:"<<e1<<endl; }void xiugai(SqList &L1) //修改第i个位置的元素{ int a;int j; ElemType e1;a=L1.length;cout<<"请选择所要修改元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要修改元素的位置:";cin>>j; }cout<<"要修改成的元素:";cin>>e1;Listxiugei(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a);}void shanchu(SqList &L1) //删除顺序表里的元素{ int a;int j; ElemType e1;a=L1.length;cout<<"请选择所要删除元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>j; }ListDelete_Sq(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a-1);}void charu(SqList &L1) //插入元素到顺序表里{ int a; int j; ElemType e1;a=L1.length;cout<<"请选择所要插入元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>j; }cout<<"要插入的元素:";cin>>e1;ListInsert(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a+1);}void hebing(SqList &L3) //合并两个顺序表{ SqList L1,L2;int a,b;InitList_Sq(L1); InitList_Sq(L2);cout<<"请输入第一个有序表的长度:"; cin>>a;cout<<"请输入第一个有序表的元素(共"<<a<<"个)"<<endl;create(L1,a);show(L1,a);cout<<"请输入第二个有序表的长度:"; cin>>b;cout<<"请输入第二个有序表的元素(共"<<b<<"个)"<<endl;create(L2,b);show(L2,b);MergeList(L1,L2,L3);cout<<"合并后的有序表如下:"; show(L3,a+b);}void main() //主菜单{ int choice;for(;;){ cout<<" 顺序表的基本操作"<<endl;cout<<" 1.顺序表的创建"<<endl;cout<<" 2.顺序表的显示"<<endl;cout<<" 3.顺序表的长度"<<endl;cout<<" 4.取第i个位置的元素"<<endl;cout<<" 5.修改第i个位置的元素"<<endl;cout<<" 6.插入元素到顺序表里"<<endl;cout<<" 7.删除顺序表里的元素"<<endl;cout<<" 8.合并两个顺序表"<<endl;cout<<" 9.退出系统"<<endl;cout<<"请选择:";cin>>choice;switch(choice){ case 1: shuru(Lx);break;case 2: show(Lx,Lx.length);break;case 3: cout<<"顺序表的长度:"<<Listlength(Lx)<<endl;break; case 4: chaxun(Lx);break;case 5: xiugai(Lx);break;case 6: charu(Lx);break;case 7: shanchu(Lx);break;case 8: hebing(Lx);break;case 9: cout<<"退出系统!"<<endl;exit(0);break;default : cout<<"输入有误,请重新选择"<<endl;break; }}}(二)单链表的基本操作#include<iostream>using namespace std;#define true 1#define false 0#define ok 1#define error 0#define overflow -2typedef int Status;typedef int ElemType;typedef struct LNode //存储结构{ ElemType data;struct LNode *next;}LNode,*LinkList;void CreateList(LinkList &L,int n) //尾插法创建单链表{ LinkList p;L=new LNode;L->next=NULL; //建立一个带头结点的单链表LinkList q=L; //使q指向表尾for(int i=1;i<=n;i++){ p=new LNode;cin>>p->data;p->next=NULL;q->next=p;q=p; }}Status GetElem(LinkList L,int i,ElemType &e)//取第i个元素{ LinkList p=L->next;int j=1;while(p&&j<i){ p=p->next;++j; }if(!p||j>i) return error; //第i个元素不存在 e=p->data;return ok;}Status LinkInsert(LinkList &L,int i,ElemType e) //插入{ LinkList p=L;int j=0;while(p&&j<i-1){ p=p->next;++j; } //寻找第i-1个结点 if(!p||j>i-1)return error; //i小于1或者大于表长加1 LinkList s=new LNode; //生成新结点s->data=e;s->next=p->next; //插入L中p->next=s;return ok;}Status ListDelete(LinkList &L,int i,ElemType &e) // 删除{ LinkList p=L;LinkList q;int j=0;while(p->next&&j<i-1){ //寻找第i个结点,并令p指向其前驱p=p->next;++j; }if(!(p->next)||j>i-1) return error; //删除位置不合理q=p->next;p->next=q->next; //删除并释放结点e=q->data;delete(q);return ok;}void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) { //合并两个顺序链表LinkList pa,pc,pb;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;delete(Lb);}void show(LinkList L) //显示{ LinkList p;p=L->next;while(p){ cout<<p->data<<"-->";p=p->next; }cout<<endl;}int Length(LinkList L,int i) //表长{ i=0;LinkList p=L->next;while(p){ ++i;p=p->next; }return i;}void xiugai(LinkList L) //修改{ int i,j=1;ElemType k;ElemType e,m;LinkList p=L->next;cout<<"请输入要修改的元素位置(0<i<length):";cin>>i;GetElem(L,i,e);cout<<"该位置的元素:"<<e<<endl;cout<<"修改后的元素值:";cin>>k;while(p&&j<i){ p=p->next;++j; }m=p->data;p->data=k;cout<<"修改后的单链表显示如下:"<<endl;show(L);}void hebing() //合并两个单链表{ int a,b;LinkList La,Lb,Lc;cout<<"请输入第一个有序链表的长度:"<<endl;cin>>a;cout<<"请输入第一个有序链表的元素共("<<a<<"个):"<<endl;CreateList(La,a);show(La);cout<<"请输入第二个有序链表的长度:"<<endl;cin>>b;cout<<"请输入第二个有序链表的元素共("<<b<<"个):"<<endl;CreateList(Lb,b);show (Lb);MergeList(La,Lb,Lc);cout<<"合并后的有序链表如下:"<<endl;show(Lc);}void main() //主函数{ int select;int x;ElemType y;LinkList list;for(;;){ cout<<" 单链表的基本操作"<<endl;cout<<" 1.单链表的创建"<<endl;cout<<" 2.单链表的显示"<<endl;cout<<" 3.单链表的长度"<<endl;cout<<" 4.取第i个位置的元素"<<endl;cout<<" 5.修改第i个位置的元素"<<endl;cout<<" 6.插入元素到单链表里"<<endl;cout<<" 7.删除单链表里的元素"<<endl;cout<<" 8.合并两个单链表"<<endl;cout<<" 9.退出系统"<<endl;cout<<"请选择:";cin>>select;switch(select){ case 1:cout<<"请输入单链表的长度:"<<endl;cin>>x;cout<<"请输入"<<x<<"个元素"<<endl;CreateList(list,x);break;case 2: cout<<"单链表显示如下:"<<endl;show(list);break;case 3: int s;cout<<"单链表的长度为:"<<Length(list,s)<<endl;break;case 4: cout<<"请选择所要取出元素的位置:";while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要取出元素的位置:";cin>>x; }GetElem(list,x,y);cout<<"该位置的元素为:"<<y<<endl;break;case 5: xiugai(list); break;case 6: cout<<"请选择要插入的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>x; }cout<<"要插入的元素值:";cin>>y;LinkInsert( list,x,y);cout<<"插入后单链表显示如下:"<<endl;show(list);break;case 7: cout<<"请选择要删除的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>x; }ListDelete(list,x,y);cout<<"要删除的元素值:"<<y<<endl;cout<<"删除后的单链表显示如下:"<<endl;show(list);break;case 8: hebing();break;case 9: exit(0);default : cout<<"输入有误,请重新输入"<<endl;break;}}}四、测试结果1)顺序表的测试结果2)单链表的测试结果五、心得体会当听到老师说写数据结构实验报告时,我有点惊讶,才学了不到一个月,就要写实验报告。

实验二:单链表基本运算实现

实验二:单链表基本运算实现
typedef struct node
{
int data; //存放表结点值
struct node *next; //存放表结点的直接后驱元素的地址
} ListNode,*LinkList;
//头插法创建初始链表
LinkList create_h(int size)
{
;//将工作指针p指向后一个结点
;//计数器累加
}
return i;
}
//打印链表中的现有元素
printList(LinkList head)
{
LinkList p;
;//将工作指针p指向第1个结点
{
p=(LinkList)malloc(sizeof(ListNode));//申请新结点的存储空间
scanf("%d",&p->data);//读入新结点的值到data域中
;//将新增结点插到头结点的后面
;//将新增结点插到头结点的后面
printf("————头插法建立链表(1)\n");
printf("————尾插法建立链表(2)\n");
printf("————按位查找元素(3)\n");
printf("————按值查找元素(4)\n");
printf("————插入元素(5)\n");
printf("————删除元素(6)\n");
printList(h);
break;
case 5:
printf("插入元素,请输入要插入元素的值:\n");

数据结构实验报告单链表

数据结构实验报告单链表

数据结构实验报告_单链表数据结构实验报告——单链表一、实验目的1.掌握单链表的基本概念和原理。

2.了解单链表在计算机科学中的应用。

3.掌握单链表的基本操作,如插入、删除、遍历等。

4.通过实验,加深对理论知识的理解,提高编程能力。

二、实验内容1.实验原理:单链表是一种线性数据结构,由一系列节点组成,每个节点包含数据域和指针域。

其中,指针域指向下一个节点,最后一个节点的指针域指向空。

单链表的主要操作包括插入、删除、遍历等。

2.实验步骤:(1)创建一个单链表。

(2)实现插入操作,即在链表的末尾插入一个新节点。

(3)实现删除操作,即删除链表中的一个指定节点。

(4)实现遍历操作,即输出链表中所有节点的数据。

3.实验代码:下面是使用Python语言实现的单链表及其基本操作的示例代码。

class Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedList:def __init__(self):self.head = Nonedef insert(self, data):new_node = Node(data)if self.head is None:self.head = new_nodeelse:current = self.headwhile current.next is not None:current = current.nextcurrent.next = new_nodedef delete(self, data):if self.head is None:returnif self.head.data == data:self.head = self.head.nextreturncurrent = self.headwhile current.next is not None and current.next.data != data:current = current.nextif current.next is None:returncurrent.next = current.next.nextdef traverse(self):current = self.headwhile current is not None:print(current.data)current = current.next4.实验结果:通过运行上述代码,我们可以看到单链表的基本操作得到了实现。

实验二 单链表操作

实验二 单链表操作

注意事项:在磁盘上创建一个目录,专门用于存储数据结构实验的程序。

因为机房机器有还原卡,请同学们将文件夹建立在最后一个盘中,以学号为文件夹名。

实验二单链表操作一、实验目的掌握单链表的基本操作:插入、删除、查找等运算。

二、实验要求1.认真阅读和掌握单链表相关操作的算法。

2.将操作函数的算法转成程序并运行(将函数剩余部分补齐)。

三、实验内容程序1:线性单链表基本操作的实现(以带头结点的单链表为例)实现单链表的创建、插入、删除和查找。

参考程序如下:#include<iostream.h>#include<malloc.h>#include<conio.h>#define ERROR 0#define OK 1typedef int ElemType;struct LNODE{ElemType data;struct LNODE *next;};typedef struct LNODE LNode;typedef struct LNODE *LinkList;//初始化单链表int init(LinkList &L){L=(LNode *)malloc(sizeof(LNode));if(!L) return(ERROR);L->next=NULL;return OK;}/*init *///求表长int ListLength(LinkList L){}//获取表中第i个元素的值int GetElem(LinkList L,int i,ElemType &e) {}//确定元素e在该链表中的位序int LocateElem(LinkList La,ElemType e){LinkList p;p=La;int i=0;while(p->next){p=p->next;i++;if(p->data==e)return i;}return 0;}//打印表中元素值void PrintList(LinkList L){LinkList p;p=L;while(p->next){p=p->next;cout<<p->data<<ends;}cout<<endl;}//插入操作int ListInsert(LinkList &L,int i,ElemType e) {}/*ListInsert Before i *///删除操作Int ListDelete(LinkList &L,int i,ElemType &e) {}//建表(头插法或尾插法都可)int CreateList(LinkList &L,int n){}//合并两个有序表void MergeList(LinkList La,LinkList Lb,LinkList &Lc){}void main(){LinkList La,Lb,Lc;ElemType e;cout<<"\n\n-------------------List Demo is running...----------------\n\n";cout<<"First is InsertList function.\n";init(La);int n;cout<<"请输入La表中元素个数:";cin>>n;cout<<endl<<"请输入"<<n<<"个元素值:";CreateList(La,n);PrintList(La);cout<<"La的表长为:"<<ListLength(La)<<endl;//取值cout<<"取第i位元素的值:\n请输入位序:";cin>>n;GetElem(La,n,e);cout<<endl<<"第"<<n<<"位元素的值为:"<<e<<endl;//定位cout<<"定位操作:\n请输入要查找的元素:";cin>>e;cout<<endl<<" 所要查找的元素在表中第"<<LocateElem(La,e)<<"位\n"; //删除cout<<"删除操作:\n输入要删除元素的位序:";cin>>n;ListDelete(La,n,e);cout<<"\n要删除的元素值为:"<<e<<endl;cout<<"删除后表中值有:"PrintList(La);init(Lb);cout<<"请输入Lb表中元素个数:";cin>>n;cout<<endl<<"请输入"<<n<<"个元素值:";CreateList(Lb,n);PrintList(Lb);cout<<"Lb的表长为:"<<ListLength(Lb)<<endl; cout<<"合并两个有序表:\n";MergeList(La,Lb,Lc);PrintList(Lc);getch();}。

数据结构 实验二:单链表的基本操作

数据结构 实验二:单链表的基本操作

数据结构实验二:单链表的基本操作数据结构实验二:单链表的基本操作实验二:单链表的基本操作一、【实验目的】1、理解和掌握单链表的类型定义方法和结点生成方法。

2、掌握建立单链表和显示单链表元素的算法。

3、掌握单链表的查找、插入和删除算法二、【实验内容】1、建立一个整形数的单链表,手动输入10个数,并从屏幕显示单链表元素列表。

2、从键盘输入一个数,查找在以上创建的单链表中是否存在该数;如果存在,显示它的位置;如果不存在,给出相应提示。

3、删除上述单链表中指定位置的元素。

以下就是程序部分代码,恳请调试并补足并使之恰当运转:1.linlist.htypedefstructnode{datatypedata;structnode*next;}slnode;voidlistinitiate(slnode**head)/*初始化*/{/*如果有内存空间,申请头结点空间并使头指针head指向头结点*/if((*head=(slnode*)malloc(sizeof(slnode)))==null)exit(1);(*head)->next=null;/*置链尾标记null*/}intlistlength(slnode*head){slnode*p=head;/*p指向首元结点*/intsize=0;/*size初始为0*/while(p->next!=null)/*循环计数*/{p=p->next;size++;}returnsize;}intlistinsert(slnode*head,inti,datatypex)/*在带头结点的单链表head的数据元素ai(0≤i≤size)结点前*//*填入一个存放数据元素x的结点*/{slnode*p,*q;intj;p=head;/*p指向首元结点*/j=-1;/*j起始为-1*/while(p->next!=null&&j<i-1)/*最终让指针p指向数据元素ai-1结点*/{p=p->next;j++;}if(j!=i-1){printf(\填入边线参数弄错!\return0;}/*生成新结点由指针q指示*/if((q=(slnode*)malloc(sizeof(slnode)))==null)exit(1);q->data=x;q->next=p->next;/*给指针q->next赋值*/p->next=q;/*给指针p->next重新赋值*/return1;}intlistdelete(slnode*head,inti,datatype*x)/*删除带头结点的单链表head的数据元素ai(0≤i≤size-1)结点*//*删除结点的数据元素域值由x带回。

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告实验目的:本实验的目的是通过实现单链表数据结构,加深对数据结构的理解,并掌握单链表的基本操作和算法。

实验内容:1、单链表的定义单链表由若干个节点组成,每个节点包含数据域和指针域,数据域存储具体数据,指针域指向下一个节点。

单链表的头指针指向链表的第一个节点。

2、单链表的基本操作2.1 初始化链表初始化链表时,将头指针置空,表示链表为空。

2.2 插入节点插入节点可以分为头插法和尾插法。

- 头插法:将新节点插入链表头部,新节点的指针域指向原头节点,头指针指向新节点。

- 尾插法:将新节点插入链表尾部,新节点的指针域置空,原尾节点的指针域指向新节点。

2.3 删除节点删除节点可以分为按位置删除和按值删除两种方式。

- 按位置删除:给定要删除节点的位置,修改前一节点的指针域即可。

- 按值删除:给定要删除节点的值,遍历链表找到对应节点,修改前一节点的指针域即可。

2.4 遍历链表遍历链表即按顺序访问链表的每个节点,并输出节点的数据。

2.5 查找节点查找节点可以分为按位置查找和按值查找两种方式。

- 按位置查找:给定节点的位置,通过遍历链表找到对应节点。

- 按值查找:给定节点的值,通过遍历链表找到第一个匹配的节点。

实验步骤:1、根据实验目的,定义单链表的结构体和基本操作函数。

2、实现初始化链表的函数,将头指针置空。

3、实现头插法或尾插法插入节点的函数。

4、实现按位置删除节点的函数。

5、实现按值删除节点的函数。

6、实现遍历链表的函数,输出节点的数据。

7、实现按位置查找节点的函数。

8、实现按值查找节点的函数。

9、设计实验样例,测试单链表的各种操作。

实验结果与分析:通过测试实验样例,我们可以验证单链表的各种操作是否正确。

如果出现异常情况,可通过调试找出问题所在,并进行修改。

单链表的操作时间复杂度与操作的位置有关,对于查找操作,时间复杂度为O(n);对于插入和删除操作,时间复杂度也为O(n)。

附件:1、单链表的定义和基本操作的源代码文件。

实验二 单链表操作

实验二 单链表操作

实验二单链表操作一、实验目的1.掌握握单链表的基本操作:插入、删除、查找等运算。

二、实验要求1.认真阅读和掌握本实验的程序。

2.上机运行本程序。

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

4.按照你对单链表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果三、实验内容单链表基本操作的实现四、实验步骤1、定义单链表的结构typedef struct Lnode{int *base;int *top;int stacksize;} *LinkList;2、定义单链表的几个常用操作:单链表的创建、插入、删除和查找。

void CreateList_L(LinkList &L,int n){L=(LinkList)malloc(sizeof(LNode));L->next=NULL;LNode *p;printf("请输入%d个元素\n",n);for(int i=n;i>0;--i){p=(LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);p->next=L->next;L->next=p;}}单链表插入,删除和查找int ListInsert_L(LinkList &L,int i,int e){//找到第i-1个元素,让p指向它LNode *p=L;int j=0;while(p&&j<i-1){p=p->next;j++;}//没有找到的情况,i<1或者i>表长if(!p||j>i-1)return -1;//为新结点申请内存LNode *s=(LinkList)malloc(sizeof(LNode));s->data=e;//插入新结点s->next=p->next;p->next=s;return 1;}3、编写主函数测试单链表的操作void main(){LinkList L;int length;printf("输入你要创建单链表的长度\n");scanf("%d",&length);CreateList_L(L,length);Output(L);length=Listlen(L);printf("单链表的长度是:%d\n",length);int i;ElemType element;printf("输入你要查找的元素的位置:\n");scanf("%d",&i);GetElem_L(L,i,element);printf("第%d个元素的值是: ",i);printf(" %d\n",element);printf("输入你要插入的元素的位置:\n");scanf("%d",&i);printf("输入你要插入的元素的值:\n");scanf("%d",&element);ListInsert_L(L,i,element);printf("插入后的线性表是: ");Output(L);printf("输入你要删除的元素的位置:\n");scanf("%d",&i);ListDelete_L(L,i,element);printf("删除后的线性表是: ");Output(L);五、实验总结:附录:完整程序#include<malloc.h>#include <stdio.h>typedef int ElemType; //定义数据元素的类型为int,你也可以在这里把它改成其它数据类型//单链表结点的定义typedef struct LNode{int *base;int *top;int stacksize;} *LinkList;/*创建单链表*****************************************/void CreateList_L(LinkList &L,int n){L=(LinkList)malloc(sizeof(LNode));L->next=NULL;LNode *p;printf("请输入%d个元素\n",n);for(int i=n;i>0;--i){p=(LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);p->next=L->next;L->next=p;}}/*输出单链表*****************************************/void Output(LinkList &L){//……//部分代码printf("开始输出单链表各个元素\n");//……printf("\n单链表结束!\n");}/*单链表的长度*****************************************/int Listlen(LinkList &L){//1、分配内存L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L.elem)//申请内存失败的情况exit(OVERFLOW);L.length=0; //线性表的长度L.listsize=LIST_INIT_SIZE;//线性表L的容量return OK;}/*得到单链表中第i个元素的值*****************************************/ int GetElem_L(LinkList &L,int i,ElemType &e){}/*删除第i个元素*****************************************/int ListDelete_L(LinkList &L,int i,ElemType &e)/*在第i个位置上插入一个新的元素*****************************************/int ListInsert_L(LinkList &L,int i,ElemType e){//1、判断插入位置i是不是正确if(i<1||i>L.length+1)return ERROR;//2、判断线性表的存储空间是否已满if(L.length>=L.listsize){//满则追加内存ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType) );//判断申请内存是否成功if(!newbase)//申请失败exit(OVERFLOW);//申请成功L.elem=newbase;L.listsize+=LISTINCREMENT;}//从第n个元素至第i个元素依次向后移动一个位置ElemType * q= &(L.elem[i-1]);//用q保存第i个元素的地址ElemType *p=&(L.elem[L.length-1]);//用p保存第n个元素的地址for( ;p>=q;--p){*(p+1)=*p;}*q=e;//将q插入到第i个位置++L.length;return OK;}/******************************************/void main(){LinkList L;int length;printf("输入你要创建单链表的长度\n");scanf("%d",&length);CreateList_L(L,length);Output(L);length=Listlen(L);printf("单链表的长度是:%d\n",length);int i;ElemType element;printf("输入你要查找的元素的位置:\n");scanf("%d",&i);GetElem_L(L,i,element);printf("第%d个元素的值是: ",i);printf(" %d\n",element);printf("输入你要插入的元素的位置:\n");scanf("%d",&i);printf("输入你要插入的元素的值:\n");scanf("%d",&element);ListInsert_L(L,i,element);printf("插入后的线性表是: ");Output(L);printf("输入你要删除的元素的位置:\n");scanf("%d",&i);ListDelete_L(L,i,element);printf("删除后的线性表是: ");Output(L);}。

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

实验2:单链表基本操作一、实验目的1.学会定义单链表的结点类型,实现对单链表的一些基本操作和具体的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。

2.掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。

二、实验要求1.预习C语言中结构体的定义与基本操作方法。

2.对单链表的每个基本操作用单独的函数实现。

3.编写完整程序完成下面的实验内容并上机运行。

4.整理并上交实验报告。

三、实验内容1.编写程序完成单链表的下列基本操作:(1)初始化单链表La。

(2)在La中第i个元素之前插入一个新结点。

(3)删除La中的第i个元素结点。

(4)在La中查找某结点并返回其位置。

(5)打印输出La中的结点元素值。

2 .构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、Lb合并成一个有序单链表Lc。

合并思想是:程序需要3个指针:pa、pb、pc,其中pa,pb分别指向La表与Lb表中当前待比较插入的结点,pc 指向Lc表中当前最后一个结点。

依次扫描La和Lb中的元素,比较当前元素的值,将较小者链接到*pc 之后,如此重复直到La或Lb结束为止,再将另一个链表余下的内容链接到pc所指的结点之后。

3.构造一个单链表L,其头结点指针为head,编写程序实现将L逆置。

(即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。

)四、思考与提高1.如果上面实验内容2中合并的表内不允许有重复的数据该如何操作?2.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb中只含La表中奇数结点,Lc中含有La表的偶数结点?/*----------------------------------------* 02_单链表.cpp -- 单链表基本操作* 对单链表的每个基本操作都用单独的函数来实现* 水上飘2009年写----------------------------------------*/// ds02.cpp : 定义控制台应用程序的入口点。

//#include "stdafx.h"#include<iostream>#include<iomanip>#include<ctime>using namespace std;typedef int ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode, *LinkList;//确保输入的数据正确int Oncemore(){int n ;cout << "输入错误,请重新输入:" ;cin >> n ;cout << endl ;if( n <= 2 )n = Oncemore( ) ;return n ;}//初始化单链表Lvoid InitList(LinkList &L){L = (LinkList)malloc(sizeof(LNode));L->next = NULL;}//逆位序创建一个带头结点的单链线性表LinkList CreateList( LinkList &L, int n ){LinkList p ;for( int i = 0; i < n; i++ ){p = (LinkList)malloc(sizeof(LNode)) ;p->data = (int)(rand()%100) ; //给新生成的结点随机赋一个值p->next = L->next ; L->next = p ; //插入到表头}return L;}//在L中第i个元素之前插入一个新结点void Insert(LinkList &L, int i){LNode *p;LNode *p1;int m;p1 = L->next ;p = (LinkList)malloc(sizeof(LNode)) ;p->data = (int)(rand()%100) ; //给新生成的结点随机赋一个值for(m = 2; m < i; m++)p1 = p1->next ;if(m == i){p->next = p1->next ;p1->next = p;cout << "在L中第i个元素之前插入一个新结点成功.";}else cout << "在L中第i个元素之前插入一个新结点失败.";}//删除La中的第i个元素结点void Delete(LinkList &L, int j){LNode *p;LNode *p1;int m;p1 = L->next ;for(m = 1; m < j; m++){p1 = p1->next ;if(m == (j-2))p = p1; //p指向欲删除结点的前一个结点}if(m == j){p->next = p1->next ; //p结点指向欲删除结点的下一个结点delete p1;cout << "删除L中的第j个元素结点成功.";}else cout << "删除La中的第j个元素结点失败.";}//在L中查找某结点并返回其值int Lookup(LinkList &L, int k){LNode *p;p = L->next ;int i;for(i = 1; i < k; i++)p = p->next ;if(i == k){cout << "在L中查找第i个结点并返回其值成功.";return p->data ;}else{cout << "在L中查找i个结点并返回其值失败.";return 0;}}/*LinkList mix(LinkList &L){LinkList p1,p2,p3;p1 = L->next ;p2 = L->next ;p3 = L->next ;while(p1->next != NULL){if(p1->data > p1->next->data)p2 = p1->next ;p1 = p1->next ;}if(p3->next = NULL){L->next = NULL;return p1;}else{p3 = L->next ;while(p3->next != p2 && !p3->next)p3 = p3->next ;p3->next = p2->next ;p2->next = NULL ;return p2;}}void Union(LinkList &La,LinkList &Lb,LinkList &Lc) {LinkList pa,pb,pc;pc = Lc;while(La->next != NULL && Lb->next != NULL) {pa = mix(La);pb = mix(Lb);if(pa->data < pb->data){pc->next = pa ;pc = pa;}else{pc->next = pb ;pc = pb;}}if(La->next != NULL)pc->next = La->next ;if(Lb->next != NULL)pc->next = Lb->next ;}*///使线性表按值非递减排列void Notdegression( LinkList &L, int n ){int m ;LinkList pa;while(n){pa = L->next ;while( pa->next ) //当pa不为最后一个结点{if( pa->data > pa->next->data ) //交换两个结点的值{m = pa->data ;pa->data = pa->next->data ;pa->next->data = m ;pa = pa->next ; //移向下一个结点}else{pa = pa->next ; //移向下一个结点continue ;}}n-- ;}}//归并La和Lb,得到元素也按非递减排列的Lcvoid Merger( LinkList &La, LinkList &Lb, LinkList &Lc ){Lc = (LinkList)malloc(sizeof(LNode));LinkList pa, pb, pc ;pa = La->next ;pb = Lb->next ;Lc->next = NULL ; //初始化pc = Lc ;while(pa && pb) //当pa或pb没有到最后一个结点{if(pa->data < pb->data) //pa结点插入到Lc表的末端{pc->next = pa ;pc = pa ;pa = pa->next;}else{ //pb结点插入到Lc表的末pc->next = pb ;pc = pb;pb = pb->next ;}}pc->next = pa ? pa : pb ; /*判断La表和Lb表是否已插入完,若没有,则剩下的插入到Lc的末端*/delete La;delete Lb; //释放头结点}//将L逆置(即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。

)void CutBack(LinkList &L){LinkList p1,p2,p3;p1 = L->next ;p3 = L ;while(p1->next) //p1指向最后一个结点,p3指向倒数第二个结点{p1 = p1->next ;p3 = p3->next ;}p2 = p1; //p2指向最后一个结点while(p3 != L) //实现倒置{p2->next = p3;p3->next = NULL ;p2 = L->next ; //指向第一个结点p3 = L ; //指向头结点while(p2->next) //p2指向新表的最后一个结点,p3指向倒数第二个结点{p2 = p2->next ;p3 = p3->next ;}}p2->next = NULL ; //让新表最后一个结点指向空p3->next = p1 ; //让p3即L头结点指向新表的第一个结点}//输出单链表Lvoid OutputList( LinkList &L ){cout << endl;LNode *L1 ;int i = 0 ;L1 = L->next ; //L1指向第一个结点while(L1->next != NULL){cout << setw(5) << L1->data ;L1 = L1->next ;i++ ;if( i % 5 == 0)cout << endl ;}cout << setw(5) << L1->data ; //输出最后一个结点的值cout << endl << endl ;}//第一题void FirstTitle(){cout << "第一题开始:" << endl;LinkList L;int n;cout << "输入表的元素个数:";cin >> n;if(n <= 2)n = Oncemore();InitList(L);CreateList(L,n);OutputList(L);int i,j;cout << "输入插入的位置:";cin >> i;Insert(L,i);OutputList(L);cout << "输入删除的位置:";cin >> j;Delete(L,j);OutputList(L);int k,m;cout << "输入要查找的结点的序号:";cin >> k;m = Lookup(L,k);cout << endl << "第" << k << "个结点的值是:" << m << endl;}//第二题void SecondTitle(){cout << "第二题开始:" << endl;LinkList La,Lb,Lc;int a,b;cout << "输入La的元素个数:";cin >> a;InitList(La);CreateList(La,a);OutputList(La);cout << "输入Lb的元素个数:";cin >> b;InitList(Lb);CreateList(Lb,b);OutputList(Lb);//Union(La,Lb,Lc); //第二题的第二种方法Notdegression(La,a);cout << "La按非递减排序后:" << endl ;OutputList(La);Notdegression(Lb,b);cout << "Lb按非递减排序后:" << endl ;OutputList(Lb);Merger(La,Lb,Lc);cout << "最后结果:" << endl;OutputList(Lc);}//第三题void ThirdTitle(){cout << "第三题开始:" << endl ;LinkList L;int a;cout << "输入L的元素个数:";cin >> a;InitList(L);CreateList(L,a);OutputList(L);CutBack(L);cout << "改变后的链表为:" << endl;OutputList(L);}void main(){srand(time(NULL));FirstTitle();cout << "---------------------------------------------------" << endl;SecondTitle();cout << "---------------------------------------------------" << endl;ThirdTitle();}。

相关文档
最新文档