今天学习了单链表,下面我将用C语言实现单链表数据运算中的插入、删除、查找、修改数据的功能,并且给出测试样例,希望多多指点。
1.定义节点的结构以及相关函数的声明:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef struct slistnode
{
int data;
struct slistnode* next;
}sltnode;
void sltnodeprint(sltnode* pf);
void tailadd(sltnode** pf, int data);
sltnode* get_tail(sltnode* pf);
void headadd(sltnode** pf, int data);
void taildel(sltnode** pf);
void headdel(sltnode** pf);
void del(sltnode** pf, sltnode*pos);
sltnode* sltfind(sltnode* pf, int data);
void sltmodify(sltnode* pf,sltnode*pos,int data);
2.功能实现:
1.尾插:
void tailadd(sltnode** pf, int data)//尾插
{
//空链表和非空链表
assert(pf&&*pf);
sltnode* new = (sltnode*)malloc(sizeof(sltnode));
if (new == NULL)
{
perror("malloc");
exit(1);
}
//空链表
if (*pf == NULL)
{
*pf = new;
(*pf)->data = data;
}
//非空链表
else
{
new->next = NULL;
new->data = data;
sltnode* z = get_tail(*pf);
z->next = new;
}
}
2.头插:
void headadd(sltnode** pf, int data)//头插
{
assert(pf&&*pf);
sltnode* new = (sltnode*)malloc(sizeof(sltnode));
if (new == NULL)
{
perror("malloc");
exit(1);
}
new->data = data;
new->next = *pf;
*pf = new;
}
3.尾删:
void taildel(sltnode** pf)//尾删
{
assert(pf && *pf);
sltnode* prev = *pf;
sltnode* ptail = *pf;
//链表中只有一个节点
if (ptail->next == NULL)
{
free(*pf);
*pf = NULL;
}
//多个节点
else
{
while (ptail->next)
{
prev = ptail;
ptail = ptail->next;
}
free(ptail);
ptail = NULL;
prev->next = NULL;
}
}
4.头删:
void headdel(sltnode** pf)//头删
{
assert(pf&&*pf);
sltnode* tmp = *pf;
*pf = (*pf)->next;
free(tmp);
tmp = NULL;
}
5.删除指定数据:
void del(sltnode** pf, sltnode* pos)
{
assert(pf && *pf);
assert(pos);
sltnode* prev = *pf;
while (prev->next != pos)
{
prev = prev->next;
}
prev->next = pos->next;
free(pos);
pos = NULL;
}
6.查找:
sltnode* sltfind(sltnode* pf, int data)//查找指定节点
{
sltnode* tmp = pf;
while (tmp != NULL)
{
if (tmp->data == data)
return tmp;
tmp = tmp->next;
}
return NULL;
}
7.修改:
void sltmodify(sltnode* pf, sltnode*pos, int data)//修改指定节点
{
pos->data = data;
}
8.打印:
void sltnodeprint(sltnode* pf)//打印链表
{
sltnode* tmp = pf;
while (tmp)
{
printf("%d->", tmp->data);
tmp = tmp->next;
}
printf("NULL\n");
}
3.测试样例:
#include"slist.h"
void slisttest()
{
sltnode* node1 = (sltnode*)malloc(sizeof(sltnode));
node1->data = 1;
sltnode* node2 = (sltnode*)malloc(sizeof(sltnode));
node2->data = 2;
sltnode* node3 = (sltnode*)malloc(sizeof(sltnode));
node3->data = 3;
sltnode* node4 = (sltnode*)malloc(sizeof(sltnode));
node4->data = 4;
sltnode* node5 = (sltnode*)malloc(sizeof(sltnode));
node5->data = 5;
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = node5;
node5->next = NULL;
sltnode* phead = node1;
sltnodeprint(phead);
headadd(&phead, 6);
sltnodeprint(phead);
tailadd(&phead, 7);
sltnodeprint(phead);
headdel(&phead);
sltnodeprint(phead);
taildel(&phead);
sltnodeprint(phead);
sltnode* find = sltfind(phead, 2);
del(&phead, find);
sltnodeprint(phead);
}
int main()
{
slisttest();
return 0;
}
4.输出结果: