代码预览:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct slist//创建节点结构体并重命名
{
int id;
struct slist* next;
}L;//也可以分开写:typedef struct slist L
//创建一个节点
L* creat_node(int data)
{
//给每个节点分配结构体所需大小的空间
L* p = (L*)malloc(sizeof(L));//类似int *p=(int*)malloc(sizeof(L))
if (p == NULL)
{
perror;
return NULL;
}
//把分配的空间数据清零
memset(p, 0, sizeof(L));//memset(链表名称,赋值的值,空间大小)
//初始化节点数据
p->id = data;
//把节点指针后续指向为NULL
p->next = NULL;
//返回指向这个节点的指针:p
return p;
}
//链表尾插
void tail_insert(L* pH, L* n)
//参数为:指向链表的指针(头结点)、指向需插入节点的指针
{
//获取当前节点的位置,访问头节点
L* p = pH;
//判断当前节点是否为尾节点
while (NULL != p->next)
{
p = p->next;//移动到下一节点
}
//循环结束说明当前节点为尾节点
p->next = n;//将新节点插入至尾节点
}
//链表头插
void top_insert(L* pH, L* n)//参数为:指向链表的指针(头结点)、指向需插入节点的指针
{
//获取当前节点的位置,访问头节点
L* p = pH;
//获取第一个节点的位置
p = p->next;//头结点后一位即首元节点,即第一个节点的位置
n->next = p;
//头结点指针再指向当前节点
pH->next = n;
}
//单链表遍历
void Print_node(L* pH)//参数为:头结点
{
//获取当前节点的位置,访问头节点
L* p = pH;
//获取第一个节点的位置,即首元节点的位置
p = p->next;//头结点后一位即首元节点,即第一个节点的位置
//判断当前节点是否为尾节点
while (NULL != p->next)
{
printf("%d ", p->id);//打印该节点的数据域
p = p->next;//移动到下一节点
}
//循环结束说明当前节点为尾节点
printf("%d\n", p->id);//打印尾节点的数据域
}
//单链表删除
int delate_list_node(L* pH, int data)//参数为:头结点、需删除节点的数据域;
//需要返回值判断有无完成删除,所以用int
{
//获取当前节点的位置,访问头节点
L* p = pH;
//定义一个指针保留当前节点
L* prev = NULL;
//判断当前节点是否为尾节点
while (NULL != p->next)
{
//保留当前节点
prev = p;
//指针移动到下一节点
p = p->next;
if (p->id == data)
{
if (p->next != NULL)//当前节点不为尾节点
{
prev->next = p->next;
free(p);
}
else//当前节点为尾节点
{
prev->next = NULL;
free(p);
}
return 1;
}
}
printf("没有需删除的节点\n");
return 0;
}
//链表清空
int Free_list_node(L* pH)
{
L* p;
while (pH != NULL)
{
p = pH->next;
free(pH);
pH = p;
}
return 0;
}
int main()
{
//创建一个节点
int i;
L* header = creat_node(0);
for (i = 0; i < 10; i++)
{
tail_insert(header, creat_node(i));
}
Print_node(header);
delate_list_node(header, 5);
Print_node(header);
top_insert(header, creat_node(5));
Print_node(header);
//清空链表
Free_list_node(header);
return 0;
}
先声明头文件,需用到三个
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
1、创建节点结构体(可重命名)
typedef struct slist//创建节点结构体并重命名
{
int id;
struct slist* next;
}L;
//重命名部分也可以分开写:typedef struct slist L;
//这里是将struct slist重命名为L;
2、编写链表相关功能程序
2.1.创建节点
//创建一个节点
L* creat_node(int data)
{
//给每个节点分配结构体所需大小的空间
L* p = (L*)malloc(sizeof(L));//类似int *p=(int*)malloc(sizeof(L))
if (p == NULL)
{
perror;
return NULL;
}
//把分配的空间数据清零
memset(p, 0, sizeof(L));//memset(链表名称,赋值的值,空间大小)
//初始化节点数据
p->id = data;
//把节点指针后续指向为NULL
p->next = NULL;
//返回指向这个节点的指针:p
return p;
}
2.2.单链表的尾插
//链表尾插
void tail_insert(L* pH, L* n)//参数为:指向链表的指针(头结点)、指向需插入节点的指针
{
//获取当前节点的位置,访问头节点
L* p = pH;
//判断当前节点是否为尾节点
while (NULL != p->next)
{
p = p->next;//移动到下一节点
}
//循环结束说明当前节点为尾节点
p->next = n;//将新节点插入至尾节点
}
2.3.单链表的头插
//链表头插
void top_insert(L* pH, L* n)//参数为:指向链表的指针(头结点)、指向需插入节点的指针
{
//获取当前节点的位置,访问头节点
L* p = pH;
//获取第一个节点的位置
p = p->next;//头结点后一位即首元节点,即第一个节点的位置
n->next = p;
//头结点指针再指向当前节点
pH->next = n;
}
2.4.单链表的遍历
//单链表遍历
void Print_node(L* pH)//参数为:头结点
{
//获取当前节点的位置,访问头节点
L* p = pH;
//获取第一个节点的位置,即首元节点的位置
p = p->next;//头结点后一位即首元节点,即第一个节点的位置
//判断当前节点是否为尾节点
while (NULL != p->next)
{
printf("%d ", p->id);//打印该节点的数据域
p = p->next;//移动到下一节点
}
//循环结束说明当前节点为尾节点
printf("%d\n", p->id);//打印尾节点的数据域
}
2.5.单链表的删除
//单链表删除
int delate_list_node(L* pH, int data)//参数为:头结点、需删除节点的数据域;需要返回值判断有无完成删除,所以用int
{
//获取当前节点的位置,访问头节点
L* p = pH;
//定义一个指针保留当前节点
L* prev = NULL;
//判断当前节点是否为尾节点
while (NULL != p->next)
{
//保留当前节点
prev = p;
//指针移动到下一节点
p = p->next;
if (p->id == data)
{
if (p->next != NULL)//当前节点不为尾节点
{
prev->next = p->next;
free(p);
}
else//当前节点为尾节点
{
prev->next = NULL;
free(p);
}
return 1;
}
}
printf("没有需删除的节点\n");
return 0;
}
2.6.单链表的清空
//链表清空
int Free_list_node(L* pH)
{
L* p;
while (pH != NULL)
{
p = pH->next;
free(pH);
pH = p;
}
return 0;
}
3、创建主函数引用
int main()
{
//创建一个节点
int i;
L* header = creat_node(0);
for (i = 0; i < 10; i++)
{
tail_insert(header, creat_node(i));
}
Print_node(header);
delate_list_node(header, 5);
Print_node(header);
top_insert(header, creat_node(5));
Print_node(header);
//清空链表
Free_list_node(header);
return 0;
}