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

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

2016-04-01 16:00 288 查看
距上一次写线性表的顺序存储结构已经有一段时间了(详戳http://blog.csdn.net/u010429311/article/details/50933932),这次主要接着来实现线性表的链式存储结构,即我们通常所说的链表。

链表可以用一组任意的存储单元存储线性表的数据元素,而存储数据的这组存储单元可以是连续的,也可以是不连续的。具体看一下图解:



在链表中,我们也可以实现链表的创建、插入、删除等操作。其原理如下图:



以下是具体的实现代码:

定义结构体:

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;

typedef struct LNode{
ElemType data;    //结点的数据
struct LNode *next;   //指向下一结点的指针
} LNode, *LinkList;


创建链表:

/*
*逆序往链表里插入n个元素
*/
Status createList(LinkList &L, int n) {
LinkList p;
L = (LinkList) malloc(sizeof(LNode));  //申请结点空间
L->next = NULL;   //建立带头结点的链表
for (; n > 0; n--) {
p = (LinkList) malloc(sizeof(LNode)); //生成新结点
scanf("%d", &p->data);  //输入结点的元素
p->next = L->next;   //插入到表头
L->next = p;
}
return OK;
}


插入元素:

/*
*往链表的第i个位置插入元素
*/
Status listInsert(LinkList &L, int i, ElemType e) {
LinkList p, s;
p = L;
int j = 0;
while (p && j < i - 1) {  //寻找第i-1个结点
p = p->next;
j++;
}
if (!p || j > i - 1) return ERROR;
s = (LinkList) malloc(sizeof(LNode)); //申请新结点
s->data = e;  //插入新的结点
s->next = p->next;
p->next = s;
return OK;
}


删除元素:

Status listDelete(LinkList &L, int i, ElemType &e) {
LinkList p, q;
p = L;
int j = 0;
while (p->next && j < i - 1) {  //寻找第i个结点
p = p->next;
j++;
}
if (!p->next || j > i - 1) return ERROR;
q = p->next;  //删除结点
p->next = q->next;
e = q->data;
free(q);  //释放被删除结点的空间
return OK;
}


遍历链表:

Status loadList(LinkList &L) {
if (L->next == NULL) {
return ERROR;
}
LinkList p;
p = L->next;  //注意,头结点没有存放数值,应从L->next开始遍历
while(p) {    //遍历结点,输出数值
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return OK;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息