【数据结构】C语言实现链表节点的插入和删除

今天又学了下链表,发上来和菜鸟一起学习,欢迎大神指点···········

今天我实现的是插入链表节点和删除链表节点。

看代码吧,注释写的不好的就见谅吧················· 

 

/*
            链表节点的插入与删除

       编译环境:VC++ 6.0
       编译系统:windows XP SP3
*/

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

//     定义链表中的节点
typedef  struct node
{
     int member;                 //     节点中的成员
     struct node *pNext;         //     指向下一个节点的指针
}Node,*pNode;

//     函数声明
pNode CreateList();                  //   创建链表函数
void TraverseList(pNode );             //   遍历链表函数
bool Insert_Node(pNode , int , int);     //     链表节点插入函数,第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据
int Del_Node(pNode, int );         //     删除链表节点,第一个参数是头节点,第二个参数是删除第几个节点,第三个作为
int main()
{
    pNode pHead = NULL;                 //   定义初始化头节点,等价于 struct Node *pHead == NULL
     int data;                         //  作为Insert_Node函数的第三个参数
     int num;                         //     作为Inset_Node函数第二个参数
     int choose;    
     int return_val;
    pHead = CreateList();             //   创建一个非循环单链表,并将该链表的头结点的地址付给pHead
    printf( " 你输入的数据是: ");
    TraverseList(pHead);     //   调用遍历链表函数
    printf( " 是否还要进行如下操作:\n ");
    printf( " 1.插入数据      2.删除数据\n ");
    printf( " 请输入: ");
    scanf( " %d ",&choose);
     switch (choose)
    {
         case  1:
            {
                printf( " 请输入要在第几个节点前插入数据: ");
                scanf( " %d ",&num);
                printf( " 请输入要插入的数据: ");
                scanf( " %d ",&data);
                 if(Insert_Node(pHead,num,data) ==  true)
                {
                    printf( " 插入成功\n插入后的数据是:\n ");
                    TraverseList(pHead);
                }
                 else
                {
                    printf( " 插入失败\n ");
                }
                printf( " 操作完成后的数据是: ");
                TraverseList(pHead);
                 break;
            }
         case  2:
            {
                printf( " 请输入要删除第几个节点的数据: ");
                scanf( " %d ",&num);
                return_val = Del_Node(pHead,num);
                 if (return_val ==  0)
                {
                    printf( " 删除失败。\n ");
                }
                 else
                {
                    printf( " 删除成功。删除的元素是:%d\n ",return_val);
                }
                printf( " 操作完成后的数据是: ");
                TraverseList(pHead);
            }
    }
     return  0;
}

//     创建链表函数
pNode CreateList()
{
     int i;                                             //     用于下面循环
     int len;                                         //     用来存放有效节点的字数
     int val;                                         //     用于临时存放用户输入的数据
    pNode pHead = (pNode)malloc( sizeof(Node));         //   分配一个不存放有效数据的头结点
    pNode pTail = pHead;                             //     链表的最后一个节点
    pTail->pNext = NULL;                             //     最后一个节点的指针置为空
    printf( " 请输入节点个数: ");
    scanf( " %d ",&len);
     for(i =  0; i < len; i++)
    {
        printf( " 第 %d 个节点的数值: ",i+ 1);
        scanf( " %d ",&val);
        pNode pNew = (pNode)malloc( sizeof(Node));     //     为节点分配空间
        pNew->member = val;                             // 将用户输入的数据赋给节点的成员
        pTail->pNext = pNew;                         // 将最后一个节点的指针指向下一个新的节点
        pNew->pNext = NULL;                             // 将新节点中的指针置为空
        pTail = pNew;                                 // 将新节点赋给最后的一个节点
    }
     return pHead;                                     // 返回头节点

}

//     遍历链表函数
void TraverseList(pNode pHead)
{
    pNode p = pHead->pNext;                             // 将头节点的指针给予临时节点p
     while(NULL != p)                                 // 节点p不为空,循环    
    {
        printf( " %d  ",p->member);                    
        p = p->pNext;                                
    }
    printf( " \n ");
     return ;
}

//     链表节点插入函数
//     第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据
bool Insert_Node(pNode pHead,  int front, int data)
{
     int i =  0;
    pNode _node = pHead;
    pNode pSwap;                                 //     用于交换
     if ((front <  1) && (NULL != _node))         // 判断用户输入的数据是否大于等于1,及_node是否为空
    {
         return  false;
    }
     while (i < front -  1)                     // 通过循环使指针指向要插入哪个节点前的节点。说的自己都不懂了,还是看下面的图吧。    
    {
        _node = _node->pNext;
        ++i;
    }
    pNode pNew = (pNode)malloc( sizeof(Node));

    pNew->member = data;                         //     把输入的数据赋给要插入的节点
    pSwap = _node->pNext;                         //     把下一个节点的地址,给用于交换的pSwap
    _node->pNext = pNew;                         //     把要插入的节点的地址,给上个节点的指针域
    pNew->pNext = pSwap;                         //     把插入节点的下一个节点的地址,给插入节点的指针域
     return  true;

}

//     删除链表节点函数
//     第一个参数是头节点,第二个参数是要删除第几个节点·······和上面的插入函数是不是很像
int Del_Node(pNode pHead, int back)
{
     int i =  0;
     int data;
    pNode _node = pHead;
    pNode pSwap;
     if ((back <  1) && (NULL == _node->pNext))
    {
        printf( " 删除失败!\n ");
         return  0;
    }
     while(i < back- 1)
    {
        _node = _node->pNext;
        ++i;
    }
    pSwap = _node->pNext;
    data = pSwap->member;
    _node->pNext = _node->pNext->pNext;
    free(pSwap);
     return data;


我自己也画了两张图片,帮助理解,反正我是这么理解的,有错的欢迎指出

先看下向链表中插入节点

 

 

下面这个是删除链表节点

 

欢迎各路神仙指正批评·············· 

转载于:https://www.cnblogs.com/scrat/archive/2012/08/17/2644086.html

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值