跟我学数据结构-- 线性表的链式存储结构
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
为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。
表头结点
链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息。
数据结点
链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息。
尾结点
链表中的最后一个数据结点,其下一元素指针为空,表示无后继。
指针节点定义
头节点定义
数据元素定义
获取第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
相关文章推荐
- 【数据结构】-线性表的链式存储结构
- 数据结构(三):线性表的链式存储结构 - 双链表的实现
- 张小五学算法与数据结构第四天(上):线性表的链式存储结构
- 数据结构二线性链表的链式存储结构
- 【数据结构】线性表的链式存储结构--单链表
- javascript实现数据结构:线性表--线性链表(链式存储结构)
- 数据结构与算法之——线性表的链式存储结构
- 数据结构:线性表之链式存储结构
- 数据结构----纯C语言实现线性表的单向链式存储结构
- 【数据结构】线性表的链式存储结构
- 张小五学算法与数据结构第四天(下):线性表的链式存储结构练习题
- <数据结构>线性表.链式存储结构
- 数据结构初学之----线性结构,树型…
- 数据结构--环队实现线性表功能实现…
- 数据结构之线性表-顺序存储结构
- 数据结构初学1(线性表)
- 【算法和数据结构】_8_线性结构_字符串_模式匹配_续_1
- 数据结构(陈越)PAT练习题 第二周:线性结构
- 数据结构-----线性表的顺序表示与实现
- Java记录 -47- 线性数据结构