C语言实现单链表
链表是一种动态数组,各个节点在内存中零散分布,通过指向下一个节点的指针连结在一起。单链表应该是最简单的一种链表了,单链表的每个节点中都有一个指向下一个节点的指针,最后一个节点指向NULL,有一个头指针指向第一个节点。下面的函数实现了单链表的创建,销毁和删除节点的功能。
在添加节点的时候,有种实现方法是根据是否新插入的节点位置是否在头结点处来分情况讨论,因为如果新节点在头结点出需要改变头指针的位置。其实不用这么麻烦,头指针和节点中的pnext指针都是指向下一个节点的指针。我们把他们看成一类指针,那上面说的两种情况实际就是一种情况了。
单链表的节点添加,销毁和节点删除都需要遍历链表这个基本操作。遍历找到相应的节点进行操作即可。
typedef struct node
{
int value;
struct node *pnext;
}NODE;
/*添加节点*/
void add_node(NODE **pnode,int new_value)
{
while ((*pnode != NULL) && (new_value > (*pnode)->value))
{
pnode = &((*pnode)->pnext);
}
NODE *new_node = (NODE *)malloc(sizeof(NODE));
if (NULL == new_node)
{
printf("malloc error\n");
return ;
}
new_node->value = new_value;
NODE *tmp = *pnode;
*pnode = new_node;
new_node->pnext = tmp;
}
/*删除节点*/
void delete_node(NODE **pnode,int value)
{
NODE *pre = NULL;
while ((*pnode != NULL) && (value != (*pnode)->value))
{
pre = *pnode;
pnode = &((*pnode)->pnext);
}
NODE *tmp = *pnode;
if ((NULL != pre) && (*pnode != NULL))
{
*pnode = (*pnode)->pnext;
pre->pnext = *pnode;
}
if (NULL == pre)
{
*pnode = (*pnode)->pnext;
}
if (NULL != tmp)
{
free(tmp);
tmp = NULL;
}
}
/*读取节点*/
void show_list(NODE *pnode)
{
while (pnode != NULL)
{
printf("%d\t", pnode->value);
pnode = pnode->pnext;
}
printf("\n");
}
/*销毁节点*/
void destroy_list(NODE **pnode)
{
NODE *current = *pnode;
NODE *tmp = NULL;
while (current != NULL)
{
tmp = current->pnext;
free(current);
current = tmp;
}
*pnode = NULL;
}
测试程序:
void main()
{
NODE *p = NULL;
int a = 0;
while (1)
{
scanf("%d", &a);
if (0 == a)
break;
add_node(&p,a);
}
show_list(p);
int b;
scanf("%d", &b);
delete_node(&p,b);
show_list(p);
destroy_list(&p);
system("pause");
}
在VS2013下测试通过