链表(C实现)

以下是我最近学习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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值