二线性表链式存储

Posted Alone0710

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二线性表链式存储相关的知识,希望对你有一定的参考价值。

1. 草稿

查找
从表头开始,查找哪个位置,pos就是几
current->next就是要查找的结点
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2. 语言描述

#ifndef _LINKLIST_H_
#define _LINKLIST_H_

typedef void LinkList;
typedef struct _tag_LinkListNode LinkListNode;

struct _tag_LinkListNode
{
    LinkListNode* next;
};

LinkList* LinkList_Create();

void LinkList_Destroy(LinkList* list);

void LinkList_Clear(LinkList* list);

int LinkList_Length(LinkList* list);

int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);

LinkListNode* LinkList_Get(LinkList* list, int pos);

LinkListNode* LinkList_Delete(LinkList* list, int pos);
#endif
#include <stdio.h>
#include <malloc.h>
#include "LinkList.h"

typedef struct _tag_LinkList
{
    LinkListNode header;
    int length;
}TLinkList;

LinkList* LinkList_Create()
{
    TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));

    if(ret != NULL)
    {
        ret->length=0;
        ret->header.next=NULL;
    }
    return ret;
}

void LinkList_Destroy(LinkList* list)
{
    free(list);
}

void LinkList_Clear(LinkList* list)
{
    TLinkList* sList = (TLinkList*)list;
    if(sList != NULL)
    {
        sList->length=0;
        sList->header.next=NULL;
    }
}

int LinkList_Length(LinkList* list)
{
    TLinkList* sList = (TLinkList*)list;
    int ret = -1;
    if(sList!=NULL)
    {
        ret = sList->length;
    }
    return ret;
}

int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
    TLinkList* sList = (TLinkList*)list;
    int ret = (sList != NULL)&&(pos >= 0)&&(node != NULL);
    int i=0;
    if(ret)
    {
        LinkListNode* current = (LinkListNode*)sList;
        for(i=0;(i<pos)&&(current->next!=NULL);i++)//第一次插入时,current->next=NULL,所以跳过循环
        {
            current = current->next;
        }
        node->next = current->next;
        current->next = node;

        sList->length++;
    }
    return ret;
}

LinkListNode* LinkList_Get(LinkList* list, int pos)
{
    TLinkList* sList = (TLinkList*)list;
    LinkListNode* ret = NULL;
    int i=0;

    if((sList!=NULL)&&(0<=pos)&&(pos<sList->length))
    {
        LinkListNode* current = (LinkListNode*)sList;//指向表头
        for(i=0;i<pos;i++)
        {
            current = current->next;
        }
        ret = current->next;
    }
    return ret;
}

LinkListNode* LinkList_Delete(LinkList* list, int pos)
{
    TLinkList* sList = (TLinkList*)list;
    LinkListNode* ret = NULL;
    int i=0;

    if((sList!=NULL)&&(0<=pos)&&(pos<sList->length))
    {
        LinkListNode* current = (LinkListNode*)sList;//指向表头
        for(i=0;i<pos;i++)
        {
            current = current->next;
        }
        ret = current->next;
        current->next = ret->next;

        sList->length--;
    }
    return ret;
}

头插法:
理不清可以代个数进去看看

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

struct Value
{
    LinkListNode header;
    int v;
};


int main()
{
    LinkList* list = LinkList_Create();
    int i=0;

    struct Value v1;
    struct Value v2;
    struct Value v3;
    struct Value v4;
    struct Value v5;

    v1.v=1;
    v2.v=2;
    v3.v=3;
    v4.v=4;
    v5.v=5;

    LinkList_Insert(list,(LinkListNode*)&v1,0);
    LinkList_Insert(list,(LinkListNode*)&v2,0);
    LinkList_Insert(list,(LinkListNode*)&v3,0);
    LinkList_Insert(list,(LinkListNode*)&v4,0);
    LinkList_Insert(list,(LinkListNode*)&v5,0);

    for(i=0;i<LinkList_Length(list);i++)
    {
        struct Value* pv = (struct Value*)LinkList_Get(list,i);

        printf("%d\\n",pv->v);
    }

   return 0;
}

在这里插入图片描述

尾插法:

LinkList_Insert(list,(LinkListNode*)&v1,LinkList_Length(list));
    LinkList_Insert(list,(LinkListNode*)&v2,LinkList_Length(list));
    LinkList_Insert(list,(LinkListNode*)&v3,LinkList_Length(list));
    LinkList_Insert(list,(LinkListNode*)&v4,LinkList_Length(list));
    LinkList_Insert(list,(LinkListNode*)&v5,LinkList_Length(list));

    for(i=0;i<LinkList_Length(list);i++)
    {
        struct Value* pv = (struct Value*)LinkList_Get(list,i);

        printf("%d\\n",pv->v);
    }

在这里插入图片描述

3. 小结

优点:

  1. 无需一次性定制链表的容量
  2. 插入和删除操作无需移动数据元素
    缺点:
  3. 数据元素必须保存后继元素的位置信息
  4. 获取指定数据元素操作需要顺序访问之前的元素

问题:
顺序表的实现中为什么保存的是具体数据元素的地址?而保存的地址存放在unsigned int中,而不是具体的指针类型中?为什么不是void*?

以上是关于二线性表链式存储的主要内容,如果未能解决你的问题,请参考以下文章

线性表的链式存储(C代码实现)

数据结构--线性表的链式存储

线性表中的顺序存储与链式存储

数据结构线性表链式存储实现

线性表的链式存储结构 ( 链表 )

线性表的链式存储