链表就是C中利用结构体,将数据和下一个结构体的地址封装在一个结构体中形成一个节点,这些节点组合起来就是一个基础的链表,根据需要可以扩展其中的内容来实现不同的需求。
实现一个链表需要定义节点,创建,初始化,插入,删除这些基本操作。
#include "stdafx.h"
#include "stdlib.h"
#include "malloc.h"
#define OK 0
#define ERRO 1
typedef int DataType;
typedef int Status;
typedef struct LNode {
DataType data;
struct LNode *next;
}LNode,*LPoint;
//表尾插入
Status CreateLink(LPoint &L, int n, DataType *E) {
int i;
LPoint p, r;
L = (LPoint)malloc(sizeof(LNode));
if (!L) return ERRO;
r = L;
for (i = 0; i < n; i++)
{
if (!(p = (LPoint)malloc(sizeof(LNode))))
return ERRO;
p->data = E[i];
r->next = p;
r = p; //尾指针右移保持指向末尾
}
r->next = NULL; //无节点插入记得置为NULL指针
return OK;
}
Status InsertLink(LPoint &L, int i, DataType e) {
//在第i个位置前插入e
LPoint in, p = L;
int counter = 0;
//找第i-1个位置
while (p->next != NULL && counter < i - 1) {
p = p->next;
counter++;
}
//这些变化需先判断再执行,方便下一个越界判断
if (!p->next || counter>i-1)
return ERRO; //超出范围
//p->next ==NULL 说明往后越界,counter >i-1 说明往前越界
if (!(in = (LPoint)malloc(sizeof(LNode))))
return ERRO;//内存不足
in->data = e;
in->next = p->next;
p->next = in;
return OK;
}
Status DelLink(LPoint L, int i, DataType e) {
//删除第i个元素,由e返回它的值
int counter = 0;
LPoint del, p = L;
while (p->next != NULL && counter < i - 1) {
p = p->next;
counter++;
}
if (!p->next || counter > i - 1)
return ERRO;//越界
del = p->next;
p->next = del->next;
e = del->data;
free(del);
return OK;
}
void PrintLink(LPoint L) {
LPoint p = L->next;
while (p) {
printf("%d->", p->data);
p = p->next;
}
printf("NULL\n");
}
int main()
{
int S[] = { 1,2,42,31,21 };
LPoint Link = NULL;
CreateLink(Link, 5, S);
PrintLink(Link);
return 0;
}
这是一个带头结点的链表,基本操作都差不多。注意若是C来实现的话,头结点需要定义为二级指针,因为在函数里面改变了指针的指向,C++可以传引用,C就只能用二级指针来指了。