一、什么是链表
链表是一种重要的数据结构。由一系列结点(地址)组成,数据元素的逻辑顺序是通过链表的指针地址实现。
由于结点可动态的生成,要用时才分配,因此链表实现对数据删除和插入时具有优势。链表分配内存时一小块一小块的,数组则是连续的一大块。缺点是不能随机访问。
二、链表相关概念
1、头结点
单链表的第一个结点,头结点的数据域不存储信息,指针域指向第一个有效结点即首结点。头结点的作用是使所有链表(包括空表)的头指针非空。
2、首结点
存放第一个有效数据的节点。
3、头指针
指向头节点的指针。
4、尾节点
存放最后一个有效数据的节点。
5、尾指针
指向尾节点的指针。
三、C语言实现
//结构体定义
struct node
{
int data; //数据域
struct node *next; //地址域
};
//创建节点
void node *init_node(int data)
{
*new = malloc(sizeof(struct node));
new->data = data;
new->next = NULL;
return new;
}
//判断链表是否为空
int isEmpty(struct node *p)
{
if (!p->next)
return 1; //为空
else
return 0;//非空
}
//递归显示链表
void show(struct node *p)
{
if (p == NULL)
return ;
printf("p=%d\n", p->data);
show(p->next);
}
//获取链表长度
int getLength(struct node *p)
{
int length = 0;
node *p1 = p->next;
while (p1) {
length++;
p1 = p1->next;
}
return length;
}
//插入节点
struct node *insert_node(struct node *front, struct node *back)
{
front->next = back;
}
//查找节点
struct node *find_node(struct node *p, int a)
{
while (p) {
if (a = p->next)
return p;
p = p->next;
}
return NULL;
}
//清空链表(删除所有节点)
void free_list(struct node *p)
{
while (p) {
struct node *temp = p;
p = p->next;
free(temp);
}
}
//删除指定节点
void delete_node(struct node *p, int a)
{
if (!p) {
printf("链表为空!\n");
return ;
}
struct node *temp = find_node(p, a);
if (!temp) {
printf("该节点不存在!\n");
return ;
}
while (temp) {
if (temp == P) {
free(p);
} else if (temp == p->next) {
free(p->next)
} else {
temp = p->next;
}
}
}
先写到这......
参考资料:
C语言单链表的基本操作总结(增删改查)_万般滋味皆生活的博客-CSDN博客_链表的基本操作