链接表是线性表的链接储存形式。线性表的储存空间是有限的,而链表的储存空间是无限的。
表中每个元素由节点Node构成,每个节点中分为一个数据区域,如 int data ,和一个指针区域 struct struct_name *next。
一条链表的第一个节点为头结点,一般不存放数据,当做头指针使用,指向下一个用来存放数据的节点。
链表的定义
typedef char ListData;
typedef struct node { //链表结点
ListData data; //结点数据域
struct node * link; //结点链域
} ListNode;
typedef ListNode * LinkList;
LinkList first;
链表插入节点
int InsertLink(Node *l, int p, DataType e)
{
Node *q = l;
int j = 1;
if (NULL == l) //入参判断
{
return FAILURE;
}
if (p > LengthLink(l) + 1) //2、判断插入位置
{
return FAILURE;
}
while (j < p) //移动指针到要插入位置的前一个
{
q = q->next;
j++;
}
if (j > p) //判断位置是否合法(如果q为空或者p=0,退出)
{
return FAILURE;
}
Node *n = (Node *)malloc(sizeof(Node)); //给结点分配空间
if (NULL == n)
{
return FAILURE;
}
n->data = e;
n->next = q->next;
q->next = n;
return SUCCESS;
}
删除节点
int DeleteLink(Node *l, int p)
{
DataType e;
Node *q = l;
int j = 1;
if (NULL == l)
{
return FAILURE;
}
if (p > LengthLink(l)) //8、判断删除位置
{
return FAILURE;
}
while (j < p) //移动指针到要插入位置的前一个
{
q = q->next;
j++;
}
if (j > p) //判断位置是否合法(如果q为空或者p=0,退出)
{
return FAILURE;
}
Node *n = q->next;
e = n->data;
q->next = n->next;
free(n);
return e;
}
销毁链表
int DestroyLink(Node **l)
{
if (NULL == (*l) || (*l)->next != NULL)
{
return FAILURE;
}
free(*l);
(*l) = NULL;
return SUCCESS;
}