C语言链表结构(2)——单链表的增删改查
单向链表的增删改查:
1. 设计链表节点
由于链表节点需要数据域以及指针域(存放着不同类型的数据),所以将每一个节点设计成一个结构体。
结构体模型:
struct data{
/* 数据域 */
...
/* 指针域 */
...
};
例子1: 每一个节点都存放着一个整型数据,那么结构体如何定义?
struct list_node{
int a; //数据域
struct list_node *next; //指针域
};
2. 初始化链表 -> 搞一个链表头
struct list_node *init_list_head(struct list_node *head) //head = NULL
{
//为头节点申请空间
head = (struct list_node *)malloc(sizeof(struct list_node));
if(head == NULL)
printf("head malloc error!\n");
//为头节点的指针域赋值
head->next = NULL;
return head;
}
3. 尾插数据 -> 在链表末尾增加一个新的节点
int tail_add_list(struct list_node *head,int num)
{
//为新节点申请空间
struct list_node *Node = NULL;
Node = (struct list_node *)malloc(sizoef(struct list_node));
//为新节点赋值
Node->a = num;
Node->next = NULL;
//寻找最后一个节点,并尾插
struct list_node *p = NULL;
for(p=head;p->next!=NULL;p=p->next);
//从循环出来时,p->next=NULL,也就是说,p指向最后一个节点!
p->next = Node;
return 0;
}
4. 遍历链表
int show_list_node(struct list_node *head)
{
struct list_node *p = NULL;
for(p=head->next;p!=NULL;p=p->next)
{
printf("%d\n",p->a);
}
return 0;
}
5. 头插 -> 在头节点之后插入一个新的节点。
int head_add_list(struct list_node *head,int num)
{
struct list_node *Node = NULL;
Node = (struct list_node *)malloc(sizeof(struct list_node));
Node->a = num;
Node->next = head->next;
head->next = Node;
return 0;
}
6. 根据特征值来寻找节点
int search_list_node(struct list_node *head,int num)
{
struct list_node *p = NULL;
for(p=head->next;p!=NULL;p=p->next)
{
if(p->a == num)
{
show_node(p);
return 0;
}
}
printf("Not Found:%d\n",num);
return -1;
}
7. 删除节点
int delete_list_node(struct list_node *head,int num)
{
struct list_node *p = NULL;
struct list_node *q = NULL;
for(q=head,p=head->next;p!=NULL;q=p,p=p->next)
{
if(p->a == num)
{
q->next = p->next;
free(p);
return 0;
}
}
return -1;
}
8. 释放整条链表的空间。
int delete_list(struct list_node *head)
{
struct list_node *p = NULL;
struct list_node *q = NULL;
for(p=q=head;p!=NULL;p=q)
{
q=p->next;
free(p);
}
return 0;
}
以上是单向链表的增删改查等功能的实现和用法,单项循环链表则是将最后一个节点的后继指针指向头结点,其他用法根据实际情况更改即可。

浙公网安备 33010602011771号