数据结构之单链表

这次介绍一下线性表的链式存储——单链表

来个关于链式存储的详细图

在这里插入图片描述

关于链表的插入和删除的图就不贴出来了,直接上代码

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node;

typedef struct Node *LinkList;

LinkList Creat_list()
{
    int len;
    int n;
    printf("please enter the length of the linked list:");
    scanf("%d", &len);
    LinkList pHead = (LinkList)malloc(sizeof(Node));
    if (pHead == NULL)
    {
        printf("Insufficient memory space!!");
        exit(0);
    }
    pHead->next = NULL;
    LinkList pTail = pHead;
    for (int i = 0; i < len; i++)  //Tail insertion(尾插法)
    {
        printf("Please enter the data of the node: ");
        scanf("%d", &n);
        LinkList pNew = (LinkList)malloc(sizeof(Node));
        if (pNew == NULL)
        {
            printf("Insufficient memory space!!");
            exit(0);
        }
        pNew->data = n;
        pNew->next = NULL;
        pTail->next = pNew;
        pTail = pNew;
    }

  /*  for (int i = 0; i < len; i++)  //Head insertion(头插法)
    {
        printf("Please enter the data of the node: ");
        scanf("%d", &n);
        LinkList pNew = (LinkList)malloc(sizeof(Node));
        pNew->data = n;
        pNew->next = pHead->next;
        pHead->next = pNew;
    }*/
    return pHead;
}

void traverse(LinkList pHead)
{
    LinkList p = pHead->next;

    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

void insert_list(LinkList &pHead)
{
    LinkList p = pHead;
    int index, num;
    printf("Please enter the location to insert: ");
    scanf("%d", &index);
    int i = 0;
    while (NULL != p && i < index - 1)
    {
       i++;
       p = p->next;
    }

    if ( p == NULL || i > index - 1)
    {
        printf("The enter location is illegal!!\n");
        return;
    }


    printf("Please enter the value to insert: ");
    scanf("%d", &num);


    LinkList pNew = (LinkList)malloc(sizeof(Node));
    if (pNew == NULL)
    {
        printf("Insufficient memory space!!");
        return;
    }
    pNew->data = num;
    pNew->next = p->next;
    p->next = pNew;
}

void delete_list(LinkList &pHead, int &e)
{
    int pos;
    printf("Please enter the location to delete :");
    scanf("%d", &pos);
    LinkList p = pHead;
    int i = 0;
    while (p->next != NULL && i < pos - 1)
    {
        p = p->next;
        i++;
    }

    if (p->next == NULL || i > pos - 1)
    {
        printf("The enter location is illegal!!\n");
        return;
    }

    LinkList tmp = p->next;
    e = tmp->data;
    p->next = tmp->next;
    free(tmp);
    tmp = NULL;
}

int length_list(LinkList pHead)
{
    int len = 0;
    LinkList p = pHead->next;

    while (p != NULL)
    {
        len++;
        p = p->next;
    }
    return len;
}

bool clear_list(LinkList *pHead)
{
    LinkList p, q;
    p = (*pHead)->next;
    while (p != NULL)
    {
        q = p->next;
        free(p);
        p = q;
    }
    (*pHead)->next = NULL;
    return true;
}


int main()
{
    LinkList pHead = Creat_list();   //Creat a single linked list


    traverse(pHead);   //Traversing a single linked list

    insert_list(pHead);    //Insert element in the single linked list (在单链表中插入元素)

    traverse(pHead);

    int e;

    delete_list(pHead, e);  //Delete a node of the single linked list
    printf("The value of the deleted node is: %d\n", e);

    traverse(pHead);

    int len = length_list(pHead);   //Get the length of the single linked list
    printf("The length of the single linked list is %d\n", len);

    if (clear_list(&pHead))    //Start emptying the single linked list
    {
        printf("Single linked list has been emptied!!\n");
    }
    return 0;
}

单链表结构与顺序存储结构优缺点

存储分配方式时间性能空间性能
1. 顺序存储结构使用的一段连续的存储空间查找:顺序存储O(1);链式存储O(n)顺序存储需要先分配好存储空间,分大会浪费,分小易发生溢出
2. 单链表则是运用任意一组存储单元来存储元素插入和删除:顺序存储移动表长的一大半O(n) ; 链式存储O(1)单链表是随时用随时分配
  • 若线性表需要频繁地查找,很少进行插入和删除操作时,宜采用顺序存储结构;若线性表需要频繁地进行插入和删除操作时,宜采用单链表存储结构;

  • 如果线性表中的元素个数变化比较大或者是未知时,最好用单链表结构;如果线性表的大致长度已知,则顺序存储的效率会更高。
    是运用任意一组存储单元来存储元素 | 插入和删除:顺序存储移动表长的一大半O(n) ; 链式存储O(1) | 单链表是随时用随时分配|

  • 若线性表需要频繁地查找,很少进行插入和删除操作时,宜采用顺序存储结构;若线性表需要频繁地进行插入和删除操作时,宜采用单链表存储结构;

  • 如果线性表中的元素个数变化比较大或者是未知时,最好用单链表结构;如果线性表的大致长度已知,则顺序存储的效率会更高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值