单链表实验 数据结构

 目录

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;

}

三、实验内容

讲清楚本实验的内容,以及为实现实验内容所采用算法的原理

1、问题描述
• 给出一组初始数据的情况下,
• 实现单链表的定义、创建、查找、插入、删除。

 

2、算法
• 单链表的存储结构包含2个部分:数据和指向下一个结点的指针
• 单链表的创建:初始化单链表,依次为输入数据分配结点,并按序链接起来
• 单链表的查找:给出第i个结点的数据域
• 单链表的插入:创建新的结点,在位置i-1和位置i之间插入新的结点,修改相
关指针指向
• 顺序表的删除:删除位置i结点,修改位置i-1结点的指针域,让其并指向i+1,
释放被删除的结点

 

3、输入
• 输入分4行:
• 第一行:第一个数字n表示样本总数目,其后跟n个样本
• 第二行:查找数据的位置
• 第三行:插入新数据的位置、新的数据
• 第四行:待删除的数据的位置

 

4、输出
• 输出分4行:
• 第一行:单链表创建后,输出链表中按顺序排列的全部数据
• 第二行:按指定位置给出数据
• 第三行:插入新数据后,输出链表中按顺序排列的全部数据
• 第四行:删除一个数据后,输出链表中按顺序排列的全部数据

 

四、实验步骤  
(上代码!!!)
1、单链表的定义
• 定义一个单链表的结点,其存储结构(C语言中的结构体)包含两个部分:数据、指向下一结点的指针
//定义单链表结构

typedef struct Node

{

    ElemType data;//数据域

    struct Node *next;//指针域,指向下一节点

}LinkList,*LNode;

//函数声明(若未声明,可能会有警告甚至错误)
2、单链表的创建
• 为每个输入元素创建空间,并将其依次链接到链表中

//创建指定个数的单链表

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;

}
3、链表的查找
• 输出第i个结点的数据域
• 如果指定位置(i)超出范围,返回
• 如果链表为空表,返回
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;

}
4、单链表的插入
• 将新结点插入到指定位置(
i)上;
• 如果指定位置(i)超出范围,返回
• 如果表长达到最大长度,返回
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;

}
5、单链表的删除
• 将指定位置(i)上的元素删除
• 如果指定位置(i)超出范围,返回
• 如果为空表,返回

//将指定位置元素删除

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;

}
6、结果输出模块
• 按照要求的格式,输出结果

 

上图    VScode环境

 

996e2673b17a41b58f062365762169f0.png

0d7dbdf5bc8c4d3fa3ff2427f2b45373.png

 

22cad1ee0a094e2a98466259fb19efb7.png

e4ecd06161454f039f9e0b27a80bbeef.png

 6a6b684a3d3145959f6f4d94957fdc9e.png

 

9138391a672b4c449a915adb3927ec41.png

 34673abbc1934493acb14235c07690f4.png

 

da2d2f841f064abdab498cb6fae872f5.png

 

 c4e9a82d0795431690f67848fce9bbba.png

 

1e10c43726b143079128a55aa75dbe48.png

 

 

 

 

 

 

 

 

 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值