介绍
本文采用结构体构造了基本的单链表(Linked_List);具有 增 删 改 查 释放 打印功能
PS:如果想在 删除功能 and 更改功能里面实现调用查找功能,需要使用结构体本身,不是用结构体指针进行传参,结构体指针传参修改不了值图一
图二
源码
#include<stdio.h>
#include<stdlib.h>
typedef struct Linked_List
{
int data;
Linked_List* naxt;
}NODE,*PNODE;
//初始化方法一:
void Init_Linked_List_1(PNODE *top)
{
(*top) = (PNODE)malloc(sizeof(NODE));
(*top)->naxt = NULL;
}
//初始化方法二
PNODE Init_Linked_List_2()
{
PNODE p = (PNODE)malloc(sizeof(NODE));
p->naxt = NULL;
return p;
}
/***************************************插入***************************************/
//头部插入方法:(PS:详解看图一)
void Top_insert(PNODE top, int data)
{
//初始化;申请一个节点空间
PNODE p = (PNODE)malloc(sizeof(NODE));
p->data = data;
p->naxt = NULL;
//新申请的p->naxt指向原Top.naxt所记录的数据
p->naxt = top->naxt;
//将Top.naxt记录新申请的节点地址 p
top->naxt = p;
}
//尾部插入方法:(PS:详解看图二)
void End_insert(PNODE top, int data)
{
//初始化;申请一个节点空间
PNODE p = (PNODE)malloc(sizeof(NODE));
p->data = data;
p->naxt = NULL;
PNODE temp=top;//用一个临时变量记录开头
//循环判断temp->naxt记录的是不是NULL;
while (temp->naxt != NULL)
{
//不满足条件则记录下一个节点地址
temp = temp->naxt;
}
//条件满足后将temp->naxt记录新节点 p
temp->naxt = p;
}
/***************************************查找***************************************/
//查找方法一:
void find_Linlist_1(PNODE top, int data)
{
//定义一个变量记录第二个节点位置
PNODE temp = top->naxt;
while (temp != NULL)//循环判断temp->naxt记录的是不是NULL;
{
if (temp->data == data)//判断查找是否匹配
{
printf("查找成功\n");
}
//temp->naxt没有遍历到NULL前,赋值下一个节点地址到temp
temp = temp->naxt;
}
}
//查找方法二:
void find_Linlist_2(PNODE top, int data)
{
//定义一个变量记录top(第一个节点)
PNODE temp = top;
int i = 0;
while (temp->naxt != NULL)//循环判断temp->naxt记录的是不是NULL;
{
//从第二个节点寻找到匹配的data插入
if (temp->naxt->data == data)
{
printf("查找完毕:第%d个节点\n", i);
}
i++;
//temp->naxt没有遍历到NULL前,赋值下一个节点地址到temp
temp = temp->naxt;
}
}
/***************************************修改***************************************/
//修改值
void change_Linlist(PNODE top, int data, int newdata)//修改
{
//查找
PNODE temp = top->naxt;//因为第一个节点没有数据,temp从第二个节点开始查找
while (temp != NULL)
{
if (temp->data == data)//判断查找是否匹配
{
//数据匹配语句
temp->data = newdata;
}
temp = temp->naxt;
}
}
/***************************************删除***************************************/
//删除值
void dele_Linlist(PNODE top, int data)//删除:有三个节点 A,B,C(要删除的B节点);
{
PNODE p = top;
while (p->naxt != NULL)
{
if (p->naxt->data == data)
{
//定义一个临时变量存储被删除值
PNODE temp = p->naxt;
p->naxt = p->naxt->naxt;
free(temp);//释放被删除值
}
p = p->naxt;
}
}
/***************************************释放***************************************/
//释放链表
void deleAll_Linlist(PNODE top)//释放链表
{
PNODE temp;//临时指针
while (top != NULL)
{
//只要top不等于NULL,就一直释放
temp = top;//while循环赋值指针节点
top = top->naxt;//指向下一个节点地址
free(temp);//释放节点
}
}
/***************************************打印***************************************/
void print_Linlist(PNODE top)
{
//定义一个变量记录top(第一个节点)
PNODE temp = top->naxt;
//循环判断temp->naxt记录的是不是NULL;
while (temp != NULL)
{
printf("%d->", temp->data);
temp = temp->naxt;
}
printf("NULL\n");
}
void main()
{
/***************************************初始化***************************************/
PNODE list;
Init_Linked_List_1(&list);
Init_Linked_List_2();
/***************************************插入值***************************************/
for (int i = 0; i < 10; i++){
End_insert(list, i);
}
/***************************************查找值***************************************/
find_Linlist_1(list, 2);
find_Linlist_2(list, 5);
/***************************************修改值***************************************/
change_Linlist(list, 1, 3);
/***************************************删除值***************************************/
dele_Linlist(list, 2);
/***************************************打印值***************************************/
print_Linlist(list);
/***************************************释放值***************************************/
deleAll_Linlist(list);
system("pause");
}