#include <stdio.h>
#include <stdlib.h> //用exit函数时所需的头文件
typedef struct node //定义一个结构体,包含一个数据变量item,一个指针next
{
int item;
struct node *next;
}node;
node *head = NULL; //定义一个头指针,指向链表开头
node *mk_node(int item) //创建节点,并在节点中放入数据
{
node *p = (node *)malloc(sizeof(node)); //用malloc开辟空间
if (p == NULL) //判断是否开辟成功
{
printf("malloc fail");
exit(1);
}
p->item = item;
p->next = NULL;
return p;
}
void free_node(node *p) //释放节点
{
free(p);
}
void insert_node(node *p) // 头插法
{
p->next = head;
head = p;
}
void print_node(node *p) //输出节点
{
printf("%d ", p->item);
}
void traverse() // 遍历
{
node *p = head;
while (p != NULL)
{
print_node(p);
p = p->next;
}
printf("\n");
}
node *search_node(int item) //查找节点
{
node *p = head;
while (p != NULL)
{
if (p->item == item)
{
return p;
}
p = p->next;
}
return NULL;
}
void rm_node(node *p) //删除节点
{
node *pre = head;
if (head == p) //判断要删除的节点是否在链表头,若在,直接将头指针往下移一个,且把删除的节点指向空
{
head = head->next;
p = NULL;
}
while (pre->next != NULL)
{
if (pre->next == p)
{
pre->next = p->next; //让查找的节点的前节点 指向 查找节点的后节点
return;
}
pre = pre->next;
}
}
void distory() //将整个链表删除
{
while (head != NULL)
{
node *pre = head;
head = head->next;
free_node(pre);
}
}
int main()
{
int target; //查找的数据
node *p = mk_node(1);
insert_node(p);
p = mk_node(2);
insert_node(p);
p = mk_node(3);
insert_node(p);
p = mk_node(4);
insert_node(p);
p = mk_node(5);
insert_node(p);
p = mk_node(6);
insert_node(p);
p = mk_node(7);
insert_node(p);
p = mk_node(8);
insert_node(p);
traverse();
printf("请输入要查找的数字:\n");
scanf("%d", &target);
p = search_node(target);
if (p != NULL)
{
printf("%p %d %d\n", p, p->item, target);
rm_node(p);//找到的数据才能被删除
traverse();
}else
{
printf("Can't find!");
}
distory();
traverse();
return 0;
}
c语言 头插法写简单链表
最新推荐文章于 2022-11-14 00:30:00 发布