【ADT】单链表_带头节点_插入与删除_C

//
//  main.c
//  单链表_带头节点_插入与删除
//
//  Created by 郭宸羽 on 30/7/2022.
//

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

typedef struct SLNode
{
    int data;
    struct SLNode *next;
}SLNode,*SLNode_p;//声明SLNode单链表结点结构 和 *SLNode_p单链表结点指针

typedef struct InfoOfSLlist
{
    SLNode_p SLlist_head_p;//创建名为SLlist_head_p的单链表指针⇔头指针,用于指向链表第一个结点。
    int length;//链表总长度
}InfoOfSLlist;//声明链表头指针结构⇔(指向单链表头结点和存储链表总长度信息,如果没有头节点就指向第一个结点)

void InitialSLL(InfoOfSLlist *SLL)//⚠️一定不能使用结构,∵如果不是指针函数的参数不会对所传结构实质性更改,仅仅是在栈区复制了一块内存进行操作
{
//1)创建头节点:
  //·创建并初始化头节点
    SLNode_p tem_p = (SLNode*)malloc(sizeof(SLNode));
    tem_p->data=-100;//头节点数据域赋值-100,方便检测原则上没有赋值操作
    tem_p->next=NULL;
    
    SLL->SLlist_head_p=tem_p;//将单链表的头指针指向头节点⇔初始化头指针

//2)创建单链表:
  /*·∵链表为结点组成,每个结点需要指针进行定向链接才能形成链表∴无法像创建动态数组一样直接用malloc开辟制定长度内存来完成单链表的创建∴需要用循环语句分别完成创建和链接*/
    SLNode_p contro_p =tem_p;//创建结点指针contro_p指向头结点,用于在创建链表的时候链接新节点与旧链表尾部
    for(int i=0;i< SLL->length;i++)//∵创建长度为length(不包括头结点)的链表
    {
        tem_p=(SLNode_p)malloc(sizeof(SLNode));//创建空结点∵Line11~Line15的定义∴SLNode_p ⇔ *SLNode ⇔ struct *SLNode
        tem_p->data=i;//为结点赋值,用来display检验
        tem_p->next=NULL;//初始化结点的next指针,这么做可以在循环内完成最后一个节点的顺利结尾
        contro_p->next=tem_p;//链接旧链表尾部与新建结点
        contro_p=tem_p;//移动控制指针用于下次循环时链接
    }
}


void DisPlay(InfoOfSLlist SLL)//不需要修改数据可以传入结构
{
    while (SLL.SLlist_head_p != NULL)
    {
        printf("[%d]->",SLL.SLlist_head_p->data);
        SLL.SLlist_head_p =SLL.SLlist_head_p->next;
    }
    printf("\n");
}

int InsertNode(InfoOfSLlist *SLL,int position,int insert_node_data)
{
//代码健壮性:输入插入位置的判断
if(position<1 || position>SLL->length+1)//为什么是lengrh+1?当position=length+1时相当于在链表尾部曾长一个节点
{
    printf("please enter position number arrange [1,%d].",SLL->length);
    return -1;
}
else
{
    //由于链表结构的特殊性,插入时先需要将控制指针移动到插入位置前一个节点上,然后创建新的节点并插入
    //1·创建临时控制节点指针指向头节点
        SLNode_p contro_p = SLL->SLlist_head_p;
    //2·将临时控制指针移动到插入位置的上一个节点上
        for(int i=0;i<position-1;i++)
        {
            contro_p=contro_p->next;
        }
    //3·创建插入结点
        SLNode_p tem = (SLNode*)malloc(sizeof(SLNode));
        tem->data=insert_node_data;
    //4·将插入节点插入至链表位置
        tem->next=contro_p->next;//插入节点的指针连接到链表
        contro_p->next=tem;//通过控制指针,将插入节点的上一个节点连接到插入节点
        SLL->length++;//链表长度信息更新
    }
    return 1;
}

int main()
{
    InfoOfSLlist SLL1;
    SLL1.length=10;
    
    InitialSLL(&SLL1);
    DisPlay(SLL1);
    DisPlay(SLL1);
    
    InsertNode(&SLL1, 11, -99);
    DisPlay(SLL1);
    
    return 1;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值