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

先上干货:

单链表是一种常见的数据结构,它由节点(Node)组成,每个节点包含两个部分:数据域(Data)和指针域(Next)。数据域用于存储数据,指针域用于指向下一个节点。通过节点之间的指针连接,形成一个链式结构。

单链表的基本思想是利用节点之间的指针来建立节点之间的关系。链表的头节点作为入口点,通过头节点可以访问到链表中的所有节点。每个节点通过指针域指向下一个节点,最后一个节点的指针域指向空(NULL),表示链表的尾部。

对于链表的操作,主要包括以下几种:

  1. 创建链表:生成头节点,将其他节点按需插入到链表中。
  2. 插入节点:在链表的指定位置或者链表末尾插入一个新节点。
  3. 删除节点:将链表中指定位置或者指定数值的节点删除。
  4. 查找节点:根据节点的位置或者数值查找节点。
  5. 遍历链表:按顺序输出链表中的所有节点数据。
  6. 修改节点:修改链表中指定位置或者指定数值的节点的数据。

相比于数组,链表的大小可以动态调整,插入和删除节点的时间复杂度为O(1)。但是链表的访问时间复杂度较高,需要从头节点开始顺序查找,时间复杂度为O(N)。

单链表在实际应用中经常用来解决需要频繁插入、删除和动态大小的问题,例如实现队列、栈、图等数据结构,以及处理大数据集合。

一、实验目的

1、掌握链表的建立、插入元素、删除表中某元素的算法。

2、对线链表相应算法的时间复杂度进行分析。

二、实验要求

1.实验前做好充分准备,包括复习第二章所学内容,事先预习好本次实验内容。

2.实验时记录实验结果,按要求完成各题。

3.实验结束后,给出实验总结与分析并及时给出本次实验的实验报告。

三、实验内容

1.完成并实现如下链表的基本操作。要求:编写测试函数运行程序,给出结果每个基本操作的运行截图。

(1)顺序表的定义

#include

#include

#include

typedef int ElemType;  //定义类型

typedef struct LNode  //定义结点

{

    ElemType data;   //数据域

    struct LNode *next;  //指向后继结点的指针域

}LNode,*PNode;  //PNode为节点类型指针

typedef struct LinkList  //定义链表

{

    PNode first;  //头指针

    PNode last;  //尾指针

    int list_size;  //链表中有效元素个数

}LinkList;

(2)顺序表的基本操作:

void InitLinkList(LinkList *list);//初始化顺序表

代码:

void InitLinkList(LinkList *list)

{

    PNode head = _buyNode(-1);

    list->first = list->last = head;

    list->list_size=0;

}

LNode *_buyNode(ElemType Item);//新增结点

代码:

LNode *_buyNode(ElemType Item)

{

    PNode p =(PNode)malloc(sizeof(LNode));

    p->data = Item;

    p->next = NULL;

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第1张图片

 

void push_front(LinkList *list,ElemType x);//向链表中头插结点

代码:

void push_front(LinkList *list,ElemType x)

{

    PNode p = _buyNode(x);

    p->next = list->first->next;

    list->first->next= p;

    list->list_size++;

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第2张图片

 

void push_back(LinkList *list,ElemType x);//向链表中尾插结点

代码:

void push_back(LinkList *list,ElemType x)

{

    while(list->last->next!=NULL)

    {

        list->last=list->last->next;

    }

     PNode p = _buyNode(x);

     list->last->next=p;

    list->list_size++;

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第3张图片

 

void showList(LinkList *list);//显示链表元素

代码:

void showList(LinkList *list)

{

    PNode p = list->first->next;

    while(p!=NULL)

    {

        printf("%d ",p->data);

        p=p->next;

    }

    printf("\n");

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第4张图片

 

void pop_back(LinkList *list);//尾部删除结点

代码:

void pop_back(LinkList *list)

{

    free(list->last->next);

    list->last->next=NULL;

    list->list_size--;

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第5张图片

 

void pop_front(LinkList *list);//头部删除节点

代码:

void pop_front(LinkList *list)

{

    list->first->next=list->first->next->next;

    list->list_size--;

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第6张图片

 

int length_list(LinkList *list);//返回链表长度

代码:

int length_list(LinkList *list)

{

    printf("%d\n",list->list_size);

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第7张图片

 

void insertLinklist_pos(LinkList *list,int pos,ElemType key);//按照pos指定的位置插入元素

代码:

void insertLinklist_pos(LinkList *list,int pos,ElemType key)

{

    PNode r=_buyNode(key);

    PNode p=_buyNode(NULL);

    p->next=list->first;

    for(int i=0;i

    {

        p=p->next;

    }

    r->next=p->next;

    p->next=r;

    list->list_size++;

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第8张图片

 

void delete_LinkList_val(LinkList *list,ElemType x);//删除第一个值为x的元素

代码:

void delete_LinkList_val(LinkList *list,ElemType x)

{

    PNode  p=_buyNode(NULL);

    p=list->first;

    while(p->next->data!=x)

    {

        p=p->next;

    }

        p->next=p->next->next;

    list->list_size--;

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第9张图片

 

void sortLinkList(LinkList *list); //排序

代码:

void sortLinkList(LinkList *list)

{

    int i,j;

    PNode p=_buyNode(NULL);

    for(i=0;ilist_size;i++)

    {

        p=list->first->next;

        for(j=0;jlist_size-1;j++)

        {

            if(p->next->datadata)

            {

                int a;

                a=p->data;p->data=p->next->data;p->next->data=a;

            }

            p=p->next;

        }

    }

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第10张图片

 

void reverseLinkList(LinkList *list);//逆置链表元素

代码:

void reverseLinkList(LinkList *list)

{

    int i,j;

    PNode p=_buyNode(NULL);

    for(i=0;ilist_size;i++)

    {

        p=list->first->next;

        for(j=0;jlist_size-1;j++)

        {

            if(p->next->data>p->data)

            {

                int a;

                a=p->data;p->data=p->next->data;p->next->data=a;

            }

            p=p->next;

        }

    }

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第11张图片

 

int findval_val(LinkList *list,ElemType key);//查找链表中首个值为key的元素位置 

代码:

int findval_val(LinkList *list,ElemType key)

{

    int i=0;

    PNode p=_buyNode(NULL);

    p=list->first->next;

    while(p->data!=key)

    {

        p=p->next;

        i++;

    }

    if(p->data==key)

    printf("%d\n",i+1);

    else printf("没有找到\n");

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第12张图片

 

int countX(LinkList *list,ElemType x) // 统计大于某个值的节点个数代码:

int countX(LinkList *list,ElemType x)

{

    PNode p=_buyNode(NULL);

    p=list->first->next;int a=0;

    for(int i=0;ilist_size;i++)

    {

        if(p->data>x)a++;

        p=p->next;

    }

    printf("%d\n",a);

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第13张图片

 

void clearLinkList(LinkList *list);//清空单链表

代码:

void clearLinkList(LinkList *list)

{

    PNode p=_buyNode(NULL);

while (list->first->next) {

p = list->first->next;

list->first->next = p->next;

p=NULL;

}

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第14张图片

 

void destroyLinkList(LinkList *list);//销毁单链表

代码:

void destroyLinkList(LinkList *list)

{

        free(list->first->next);

}

运行截图:

数据结构实验之单链表----单链表的基本操作_第15张图片

 

#include 
#include 
#include 

typedef int ElemType;  //定义类型

typedef struct LNode  //定义结点
{
    ElemType data;   //数据域
    struct LNode *next;  //指向后继结点的指针域
}LNode,*PNode;  //PNode为节点类型指针

typedef struct LinkList  //定义链表
{
    PNode first;  //头指针
    PNode last;  //尾指针
    int list_size;  //链表中有效元素个数
}LinkList;

void InitLinkList(LinkList *list);//初始化链表

LNode *_buyNode(ElemType Item);//新增结点

void push_front(LinkList *list,ElemType x);//向链表中头插结点

void push_back(LinkList *list,ElemType x);//向链表中尾插结点

void showList(LinkList *list);//显示链表元素

void pop_back(LinkList *list);//尾部删除结点

void pop_front(LinkList *list);//头部删除节点

int length_list(LinkList *list);//返回链表长度

void insertLinklist_pos(LinkList *list,int pos,ElemType key);//按照pos指定的位置插入元素

void delete_LinkList_val(LinkList *list,ElemType x);//删除第一个值为x的元素

void sortLinkList(LinkList *list); //排序

void reverseLinkList(LinkList *list);//逆置链表元素

int findval_val(LinkList *list,ElemType key);//查找链表中首个值为key的元素位置

int countX(LinkList *list,ElemType x); //统计大于某个值的节点个数

void clearLinkList(LinkList *list);//清空单链表

void destroyLinkList(LinkList *list);//销毁单链表
#include "LinkList.h"

void InitLinkList(LinkList *list)
{

}

LNode *_buyNode(ElemType Item)
{

}

void push_front(LinkList *list,ElemType x)
{

}

void push_back(LinkList *list,ElemType x)
{

}

void showList(LinkList *list)
{

}

void pop_back(LinkList *list)
{

}

void pop_front(LinkList *list)
{

}

int length_list(LinkList *list)
{

}

void insertLinklist_pos(LinkList *list,int pos,ElemType key)
{

}

void delete_LinkList_val(LinkList *list,ElemType x)
{

}

void sortLinkList(LinkList *list)
{

}

void reverseLinkList(LinkList *list)
{

}

int findval_val(LinkList *list,ElemType key)
{

}

int countX(LinkList *list,ElemType x)
{

}

void clearLinkList(LinkList *list)
{

}

void destroyLinkList(LinkList *list)
{

}

#include
#include "LinkList.h"

int main()
{

}
 

你可能感兴趣的:(数据结构,数据结构,链表,c语言,c++)