一、单向链表功能函数初始化
/*********************************************/
/*demon:单向链表author:乐乐*/
/********************************************/
typedef char data_t;
//1.定义单向链表结构体
typedef struct node_t
{
data_tdata;
struct node_t *next;
}linknode_t,*linklist_t;
//2.创建链表
linklist_t Creat_link(void)
{
linklist_t football_list;
football_list = (linklist_t)malloc(sizeof(linknode_t));
//切记申请空间
if(NULL == list)
{
printf("malloc error\n");
return NULL;
}
football_list->next= NULL;
return football_list;
}
二、插入数据
//3.尾插
int InsertLink_End(linklist_t end, data_t data)
{
linklist_t new ;
new = (linklist_t) malloc(sizeof(linknode_t));
if(NULL == new)
{
printf("InsertLinkEnd: malloc error\n");
return 0;
}
while(end->next != NULL)
{
end = end->next;
//循环到尾部节点
}
new->data = https://www.it610.com/article/data;
new->next = NULL;
end->next = new;
//使尾节点指向要插入的节点
return 1;
}
//4.获得链表中第pox节点首地址
//pox:要获取的节点位置
linklist_t GetLink(linklist_t list, int pos)
{
linklist_t p = list;
int i;
for(i = 0;
i < pos;
i++)
{
if(p == NULL)
return NULL;
p = p->next;
}
return p;
}
//5.在指定pox位置插入新节点
//思想:找到要插入位置的前一个节点,使前一个节点的next指向插入的新节点,新节点的next指向要插入位置的节点数据
int InsertLink_Any(linklist_t list,int pos, data_t data)
{
linklist_t before = list;
linklist_t new;
before = GetLink(list, pos-1);
// 找插入位置前一个节点
if(NULL == before)
return -1;
new = (linklist_t)malloc(sizeof(linknode_t));
if(NULL == new)
{
printf("InsertLinkAny malloc error\n");
return 0;
}
new->data = https://www.it610.com/article/data;
new->next = before->next;
// 插入数据的next指向该位置之前的next指向的节点
before->next = new;
//插入位置之前的next指向要插入的节点new
return 1;
}
//6.删除链表中指定位置节点
int DeleteLink_Any(linklist_t list, int pos)
{
linklist_t before, p;
before = GetLink(list, pos-1);
if(before != NULL && before->next != NULL)//确保删除的不是头尾
{
p = before->next;
before->next = p->next;
// 删除操作
free(p);
//释放要删除的节点
return 1;
}
else
{
return 0;
}
}
//7.修改指定位置的数据
int UpdateLink(linklist_t list, int pos,data_t value)
{
linklist_t p = GetLink(list, pos);
//获得链表中第pox节点首地址
if(NULL == p)//确保修改的原数据不为空
return 0;
p->data = https://www.it610.com/article/value;
return 1;
}
//8.链表的长度
int Get_Len(linklist_t list)
{
linklist_t p = list->next;
int len = 0;
while(p != NULL)
{
p = p->next;
len++;
}
return len;
}
//9.释放链表所有节点空间
void Free_Link(linklist_t list)
{
linklist_t p = list->next;
//p指向次节点
while(p != NULL)
{
list->next = p->next;
free(p);
//释放p指向的节点
p = list->next;
}
free(list);
//释放头节点
}
//10.遍历链表
void ShowLink(linklist_t list)
{
linklist_t p = list->next;
while(p != NULL)
{
printf("%c -- ", p->data);
p = p->next;
// p指向下一个节点
}
printf("\n");
}
int main()
{
linklist_t list = CreateLink();
//创建链表
InsertLink_End(list, 'A');
//第一个元素是A
InsertLink_End(list, 'B');
//第二个元素是B
InsertLink_End(list, 'C');
//第三个元素是C
ShowLink(list);
//打印A-B-C
InsertLink_Any(list, 2, 'D');
//在第二个位置插入D
ShowLink(list);
//打印A-D-B-C
printf("link len = %d\n",GetLen(list));
//打印表长
DeleteLink_Any(list, 2);
//删除第二个位置数据
ShowLink(list);
//打印A-B-C
UpdateLink(list, 3, 'E');
//将第三个位置的C替换为E
ShowLink(list);
//打印A-B-E
FreeLink(list);
//释放链表,使用完一定要释放,避免内存泄漏
return 0;
}
【单向链表的基本应用-增删改查】运行结果
文章图片
推荐阅读
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 数据结构和算法|LeetCode 的正确使用方式
- 先序遍历 中序遍历 后序遍历 层序遍历
- 数据结构|C++技巧(用class类实现链表)
- 数据结构|贪吃蛇代码--c语言版 visual c++6.0打开
- 算法|算法-二分查找
- 数据结构学习指导|数据结构初阶(线性表)
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- java|ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口)- Java - 细节狂魔