单链表(以带头节点的单链表为例)的表示图如下:
1. 定义单链表结构,结构体中包括 data 数据域和 next 指针域,代码如下:
typedef struct Node
{
int data;//数据域
struct Node *next;//指向下一个节点
}Node,*List;//List == Node*
2. 单链表的初始化,代码如下:
void InitList(List plist)
{
assert(plist != NULL);
plist->next = NULL;
//plist->data不用操作
}
3. 利用头插法进行插入,代码如下:
bool Insert_Head(List plist,int val)
{
Node *p = (Node *)malloc(sizeof(Node));
p->data = val;
p->next = plist->next;
plist->next = p;
return true;
}
4. 利用尾插法进行插入,代码如下:
bool Insert_Tail(List plist,int val)
{
Node *p = (Node *)malloc(sizeof(Node));
p->data = val;
Node *q;
for(q=plist;q->next!=NULL;q=q->next) ;
//将p插入在q的后面
p->next = q->next;
q->next = p;
return true;
}
5. 按照关键字进行查找,代码如下:
Node *Search(List plist,int key)
{
for(Node *p=plist->next;p!=NULL;p=p->next)
{
if(p->data == key)
{
return p;
}
}
return NULL;
}
6. 查找关键字 key 的前驱,代码如下:
static Node *SearchPri(List plist,int key)
{
for(Node *p=plist;p->next!=NULL;p=p->next)
{
if(p->next->data == key)
{
return p;
}
}
return NULL;
}
7. 按照关键字进行删除,代码如下:
bool Delete(List plist,int key)
{
Node *p = SearchPri(plist,key);
if(p == NULL)
{
return false;
}
Node *q = p->next;
p->next = q->next;//将q从链表中剔除
free(q);
return true;
}
8. 判空,代码如下:
bool IsEmpty(List plist)
{
return plist->next == NULL;
}
9. 求单链表的长度,代码如下:
int GetLength(List plist)
{
int count = 0;
for(Node *p=plist->next;p!=NULL;p=p->next)
{
count++;
}
return count;
}
10. 打印单链表,代码如下:
void Show(List plist)
{
for(Node *p=plist->next;p!=NULL;p=p->next)
{
printf("%d ",p->data);
}
printf("\n");
}
11. 清楚单链表,代码如下:
void Clear(List plist)
{
Destroy(plist);
}
12. 摧毁单链表,代码如下:
void Destroy(List plist)
{
Node *p;
while(plist->next != NULL)//删除第一个数据节点
{
p = plist->next;
plist->next = p->next;
free(p);
}
/*
Node *p = plist->next;
}
13. 单链表逆置,代码如下:
void Revers(List plist)
{
//头插的思想
if(plist==NULL || plist->next==NULL ||
plist->next->next==NULL)
{
return ;
}
Node *p = plist->next;
Node *q;
plist->next = NULL;//
while(p != NULL)
{
q = p->next;
//将p头插进链表
p->next = plist->next;
plist->next = p;
p = q;
}
}