距上一次写线性表的顺序存储结构已经有一段时间了(详戳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;
}