您的位置:首页 > 理论基础 > 数据结构算法

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

2013-10-04 15:20 435 查看
链式存储定义

为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。

表头结点

 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息。

数据结点

 链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息。

尾结点

 链表中的最后一个数据结点,其下一元素指针为空,表示无后继。

指针节点定义

头节点定义

数据元素定义

获取第pos个元素操作

 判断线性表是否合法

 判断位置是否合法

 由表头开始通过next指针移动pos次后,当前元素的next指

针即指向要获取的元素

插入元素到位置pos的算法

 1 判断线性表是否合法

 2 判断插入位置是否合法

 3 由表头开始通过next指针移动pos次后,当前元素的next指

4 针即指向要插入的位置

 5 将新元素插入

 6 线性表长度加1

删除元素操作

node->next = current->next;

current->next = node;

删除第pos个元素的算法

 1 判断线性表是否合法

 2 判断插入位置是否合法

 3 获取第pos个元素

 4将第pos个元素从链表中删除

 5 线性表长度减1

具体操作代码

#include <stdio.h>

#include <malloc.h>

#include "LinkList.h"

typedef struct _tag_LinkList

{

LinkListNode header;

int length;

} TLinkList;

LinkList* LinkList_Create() // O(1)

{

TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));



if( ret != NULL )

{

ret->length = 0;

ret->header.next = NULL;

}



return ret;

}

void LinkList_Destroy(LinkList* list) // O(1)

{

free(list);

}

void LinkList_Clear(LinkList* list) // O(1)

{

TLinkList* sList = (TLinkList*)list;



if( sList != NULL )

{

sList->length = 0;

sList->header.next = NULL;

}

}

int LinkList_Length(LinkList* list) // O(1)

{

TLinkList* sList = (TLinkList*)list;

int ret = -1;



if( sList != NULL )

{

ret = sList->length;

}



return ret;

}

int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) // O(n)

{

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 = current->next;

}



node->next = current->next;

current->next = node;



sList->length++;

}



return ret;

}

LinkListNode* LinkList_Get(LinkList* list, int pos) // O(n)

{

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) // O(n)

{

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;

}

代码下载地址http://download.csdn.net/detail/hongkangwl/6353597
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: