目录
1实验目的 2实验要求 3实验内容 4实验步骤 5代码图片
一、实验目的
(套话几行)
了解和掌握线性表的链式存储结构;
掌握用C语言上机调试线性表的基本方法;
掌握线性表的基本操作;
插入、删除、查找以及线性表运算在顺序存储结构和链接存储结构上的运算,以及相应算法的性能分析。
熟悉C++/C语言编程、熟练使用C++/C语言实现单链表的创建、查找、插入、删除。
二、实验要求
讲清楚进行本实验之前需要的先验知识及条件
先验知识:
线性链表的定义:线性链表中,每个元素也被称为结点,结点中包含两项,数据域;数据元素的信息,指针域:指向后继的指针。对于每个结点,在需要时动态生成,在删除时释放空间。!!!相对于顺序表的优势所在。
头节点:
1、与其他结点具有相同的特性。
2、其指针域存放指向首元结点(含首个元素的结点)的指针。
3、其数据域可以为空,也可以为线性链表的长度信息。当链表不设头结点时,根据L=NULL来判断链表长度是否为零。当链表设头结点时,判断L->next=NULL语句,链表长度是否为零。
查找指定元素:
在线性链表中找第i个元素,由于链表中的元素存储位置没有邻接关系,因此,只能出首元结点(或头结点)开始,顺着链一个个地查找。
线性链表的插入:
插入的时间复杂度跟查找是一样的,时间复杂度为O(n)。
但在已知(指定)结点后插入新节点,时间复杂度为O(1)。
线性链表的删除:
int deleteLinkList(LinkList *L, int pos, ElemType *e)
{
while(pos < 1 || pos > getLen(L))
{
printf("输入超出范围,请重新输入:\n");
scanf("%d",&pos); }//删除位置错误
LinkList *r = L, *d;
while(--pos > 0)
{
r = r->next;//将尾指针移动到删除位置
}
d = r->next;//删除元素节点
*e = d->data;//保存删除元素值
r->next = d->next;//将尾指针跳过删除节点链入下一个节点
free(d);//释放删除节点
return 1;
}
三、实验内容
讲清楚本实验的内容,以及为实现实验内容所采用算法的原理
//定义单链表结构
typedef struct Node
{
ElemType data;//数据域
struct Node *next;//指针域,指向下一节点
}LinkList,*LNode;
//函数声明(若未声明,可能会有警告甚至错误)
//创建指定个数的单链表
LinkList *createList(int len)
{
int i;
ElemType e;
LinkList *L = initList(L), *r, *n;//分别定义头指针、尾指针、新指针
r = L;//尾指针初始化为头指针
for(i = 0;i < len;i ++)
{
scanf("%d", &e);
n = (LinkList *) malloc(sizeof(LinkList));//申请空间
n->data = e;
n->next = NULL;//新指针指针域置空
r->next = n;//将新指针链入单链表末尾
r = r->next;//尾指针往后移
}
return L;
}
Node* Get(LinkList *L,int pos)
{
while(pos < 1 || pos > getLen(L))
{
printf("输入超出范围,请重新输入:\n");
scanf("%d",&pos);
}
Node *p = L;
if (p == NULL || pos == 0)
{
return L;
}
for (int i = 0; p && i < pos; i++)
{
p = p->next;
}
return p;
}
int insertLinkList(LinkList *L, int pos, ElemType e)
{
while(pos < 1 || pos > getLen(L)+1)
{
printf("输入超出范围,请重新输入:\n");
scanf("%d",&pos);
}//插入位置错误
LinkList *r = L, *n;
n = (LinkList *) malloc(sizeof(LinkList));
n->data = e;
n->next = NULL;
while(--pos > 0)
{
r = r->next;//将尾指针移动到插入位置
}
n->next = r->next;//先把新指针(插入值)链入尾指针后一个节点
r->next = n;//再把新指针(插入值)链入尾指针之后
return 1;
}
//将指定位置元素删除
int deleteLinkList(LinkList *L, int pos, ElemType *e)
{
while(pos < 1 || pos > getLen(L))
{
printf("输入超出范围,请重新输入:\n");
scanf("%d",&pos);
}//删除位置错误
LinkList *r = L, *d;
while(--pos > 0)
{
r = r->next;//将尾指针移动到删除位置
}
d = r->next;//删除元素节点
*e = d->data;//保存删除元素值
r->next = d->next;//将尾指针跳过删除节点链入下一个节点
free(d);//释放删除节点
return 1;
}
上图 VScode环境