二线性表链式存储
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. 小结
优点:
- 无需一次性定制链表的容量
- 插入和删除操作无需移动数据元素
缺点: - 数据元素必须保存后继元素的位置信息
- 获取指定数据元素操作需要顺序访问之前的元素
问题:
顺序表的实现中为什么保存的是具体数据元素的地址?而保存的地址存放在unsigned int中,而不是具体的指针类型中?为什么不是void*?
以上是关于二线性表链式存储的主要内容,如果未能解决你的问题,请参考以下文章