线性表的链式存储结构
线性表的链式存储结构使用任意的存储单元存储线性表的数据元素, 为了连接相邻的元素,数据元素在存储自己的数据信息的同时还需要存储一个指向下一个元素的指针。这两个部分可以区分为数据域和指针域,两者组成结点。
链式存储结构中有单链表,双链表, 和循环链表。主要区别在于指针域的设计上,这篇博客主要讲单链表的使用
单链表
- 指针域为一个指向后继元素的指针
单链表的链表结构的定义
typedef char Elemtype;
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode, *LinkList;
单链表的基本运算
- 初始化单链表
/*
初始化链表
*/
Status InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(LNode));
if (!*L)
return ERROR;
(*L)->next = NULL;
return OK;
}
- 销毁单链表
/*
销毁链表
*/
Status DestoryList(LinkList *L)
{
LinkList temp;
while (*L){
temp = (*L)->next;
free(*L);
*L = temp;
}
return OK;
}
- 清空单链表
/*
清空链表
*/
Status ClearList(LinkList L)
{
DestoryList(&(L->next));//将头结点之后的结点全部销毁
L->next = NULL;
return OK;
}
- 在单链表中进行插值操作
/*
在链表中插入值
*/
Status InsertList(LinkList L, int i, Elemtype e)
{
LinkList new_node = (LinkList)malloc(sizeof(LNode));
if (!new_node)
return ERROR;
new_node->data = e;
LinkList p = L;
int j = 0;
while (p != NULL && j < i - 1){//将p的位置确定到第i-1个,在其后面插入新值
p = p->next;
j++;
}
if (p == NULL || j > i - 1)
return ERROR;
new_node->next = p->next;
p->next = new_node;
return OK;
}
- 单链表中的删除元素操作
/*
删除链表中的值
*/
Status DeleteList(LinkList L, int i, Elemtype *e)
{
int j = 0;
LinkList p = L;
while (p->next != NULL && j < i - 1){
p = p->next;
++j;
}
if (p->next == NULL || j > i - 1)
return ERROR;
p->next = p->next->next;
return OK;
}
- 打印链表中的值
/*
查找链表中的值
*/
Status GetElem(LinkList L, int i, Elemtype *e)
{
int j = 0;
LinkList p = L;
while (p != NULL && j < i){
p = p->next;
++j;
}
if (p == NULL || j > i)
return ERROR;
*e = p->data;
return OK;
}
- 查找链表中的值
/*
查找链表中的值
*/
Status GetElem(LinkList L, int i, Elemtype *e)
{
int j = 0;
LinkList p = L;
while (p != NULL && j < i){
p = p->next;
++j;
}
if (p == NULL || j > i)
return ERROR;
*e = p->data;
return OK;
}
- 查找值的前驱元素
/*
得到链表中值的前驱元素
*/
Elemtype GetPreElem(LinkList L, Elemtype e)
{
LinkList p = L->next;
LinkList temp;
while (p->next != NULL){
temp = p;
p = p->next;
if (p->data == e){
return temp->data;
}
}
return ERROR;
}
- 查找值的后继元素
/*
得到链表中值的后继元素
*/
Elemtype GetNextElem(LinkList L, Elemtype e)
{
LinkList p = L->next;
while (p->next != NULL){
if (p->data == e){
return p->next->data;
}
p = p->next;
}
return ERROR;
}
- 测试的代码
int main()
{
LinkList L;
Elemtype e;
printf("初始化链表\n");
InitList(&L);
printf("在链表中插入值:\n");
InsertList(L, 1, 'a');
InsertList(L, 2, 'b');
InsertList(L, 3, 'c');
InsertList(L, 4, 'd');
InsertList(L, 5, 'e');
InsertList(L, 6, 'f');
InsertList(L, 7, 'g');
printf("打印链表中的数据元素\n");
DispList(L);
printf("删除链表中的数据元素\n");
DeleteList(L, 2, &e);
DispList(L);
DeleteList(L, 4, &e);
DispList(L);
GetElem(L, 3, &e);
printf("第3个元素的值是 %c\n", e);
printf("c的前驱元素是 %c\n", GetPreElem(L, 'c'));
printf("a 的后继元素为%c\n", GetNextElem(L, 'a'));
printf("销毁链表\n");
DestoryList(&L);
system("pause");
return 0;
}