以下是我最近学习C/C++语法,编写的简单链表实现程序(增删改查),欢迎大家来共同探讨
#include <stdio.h>
#include <stdlib.h>
//定义一个链表节点结构体
typedef struct NodeTag
{
int data;
struct NodeTag* next;
}Node;
//创建一个伪头结点,相当于头指针的作用
Node head = {0};
//判空
bool empty()
{
if(NULL == head.next)
{
return true;
}
return false;
}
//添加节点
bool AddNode(int value)
{
//申请新的节点空间
Node* node = (Node*)malloc(sizeof(Node));
if(NULL == node)
{
return false;
}
node->data = value; //将传进来的数据赋给data
node->next = NULL; //新节点的next指向空
Node* cur = &head; //定义一个cur指针,并指向伪头结点地址
// 遍历链表,直到找到尾节点,即cur->next为NULL
while (NULL != cur->next)
{
cur = cur->next;
}
//在尾节点后加入Node节点,即cur->next指向新节点即可
cur->next = node;
return true;
}
//删除某数据节点
bool DeleteNode(int value)
{
//调用判空函数
if (true == empty())
{
printf("List NULL\n");
return false;
}
Node* cur = head.next; //定义一个cur指针,指向真正的第一个节点
Node* pre = NULL; //定义一个pre指针,初始化为空
//遍历链表,匹配数据
while (value != cur->data)
{
//链表可能没有这个数据的情况
if (NULL == cur->next)
{
printf("No this Node\n");
return false;
}
pre = cur; //此时cu指向的这个节点不是目标节点,所以变成pre指针
cur = cur->next; //curz指针指向后移
}
//此时cur指向的节点的数据为目标数据,即要释放cur指向的节点,此时后记节点要连接起前节点的后指针
pre->next = cur->next;
free(cur);
return true;
}
//查找某个节点
bool FindNode(int value)
{
//链表为空
if (true == empty())
{
printf("List Null\n");
return false;
}
Node* cur = head.next; //定义cur指针指向真正的第一个节点
//遍历链表,匹配查找节点
while (value != cur->data)
{
//链表中没有此节点
if (NULL == cur->next)
{
printf("No this Node\n");
return false;
}
cur = cur->next;
}
printf("%d\n", cur->data);
return true;
}
//修改某个节点
bool ResetNode(int value1, int value2)
{
if (true == empty())
{
printf("List Null\n");
return false;
}
//遍历链表
Node* cur = head.next;
while (value1 != cur->data)
{
if (NULL == cur->next)
{
printf("No this Node\n");
return false;
}
cur = cur->next;
}
cur->data = value2;
return true;
}
//输出链表
bool output()
{
if (true == empty())
{
return false;
}
//遍历链表,并输出链表数据
Node* cur = head.next;
while (NULL != cur)
{
printf(" %d ", cur->data);
cur = cur->next;
}
printf("\n");
return true;
}
int main()
{
AddNode(10);
output(); //10
AddNode(20);
output(); //10 20
AddNode(30);
output(); // 10 20 30
DeleteNode(40);
output(); // no this data 10 20 30
DeleteNode(30);
output(); // 10 20
FindNode(40); //no this data
FindNode(20); //20
ResetNode(30, 40);
output(); //no this data 10 20
ResetNode(20, 50);
output(); //10 50
getchar();
return 0;
}