动态单链表基础操作(创建、插入和删除),附代码

写的也是一些笔记的东西,都是基础的东西,如果你看其他博主关于链表教学的视频和博客感觉原理都懂了,但是一看代码就很懵的话,建议您耐心看完。
所谓动态链表为在链表的插入、删除、创建等操作时会有内存的动态变化。

1 单链表的创建

1.1 结构体定义

定义比较简单,代码如下:

//定义一个结点
struct LNode{
    int data;						//数据域
    struct LNode *next;		//指针域
}LNode;
typedef struct LNode* LinkList;  //LinkList = struct LNode*,方便后面调用

1.2 创建空链表

关于空链表创建其实就是创建一个头结点,代码如下:

//创建一个空表
LinkList CreatList(){
    //headlist 指针在申请成功内存后变成了一个结构体变量
    LinkList headlist = (LinkList)malloc(sizeof(LNode));
    if(headlist == NULL){   //内存不足,申请失败
        printf("内存申请失败");
        return NULL;
    }
    //给变量初始化,其中头结点的数据域通常不赋值
//    headlist->data = 1;
    headlist->next = NULL;
    return headlist;
}

1.3 创建结点

下面的函数是创建一个单结点的函数,其实和空链表的操作是差不多的:

//创建结点
LinkList CreatNode(int dat){
    LinkList newnode = (LinkList)malloc(sizeof(LNode));
    newnode->data = dat;
    newnode->next = NULL;
    return newnode;
}

1.4 通过头插法插入结点

以头插法来介绍以下插入的大概原理,其他方法不以赘述。
头插法的基本原理如下图:
1

//通过头插法插入结点
void InsertNode_ByHead(LinkList headnode,int dat){
    LinkList newnode = CreatNode(dat);
    //以下两行代码顺序不能变,不然会丢数据
    newnode->next = headnode->next;
    headnode->next = newnode;
}

2 链表打印

链表打印的基本思路流程为:
1.定义一个指针,指向头结点的下一个结点;
2.判断指针指向是否为NULL,以此判断是否到达链表尾部或此为空链表;
3.打印数据;
4.使此指针指向下一个结点;
5.重复2,3,4操作,直至结束。

//打印结点数据
void PrintList(LinkList headnode){
	//指向头结点的下一个结点是因为头结点数据域无数据或不需要打印
    LinkList pmove = headnode->next;
    while(pmove){	//判断pmove是否指向NULL
        printf("%d\n",pmove->data);
        pmove = pmove->next;
    }
}

3 链表删除指定数据的结点

链表删除指定数据的结点的基本思路流程为:
1.定义两个指针,a指针用来指向下一个结点,b指针用来指向a指针指向结点的上一个结点;
2.判断是否为空表;
3.判断a指针指向结点的数据域是否等于需要删除结点的数据,等于执行步骤6,不等于则执行步骤4;
4.将a指针地址赋给b指针,并将b指针的下一个结点的地址赋给a指针;
5.判断a指针指向是否为空,若不为空则执行步骤3,为空则说明已到链表末尾,说明链表内无需要删除数据的结点,则结束函数;
6.此时a指针指向的结点为我们需要删除的结点,我们需要先将b指针的指针域指向a指针的指针域;
7.删除掉a指针指向的结点;
代码如下:

//删除指定数据的结点
void DeleteList_PointData(LinkList headnode,int dat){
    LinkList nodenext  = headnode->next;
    LinkList nodefront = headnode;
    if(nodenext == NULL){
        printf("空链表无法删除");
        return;
    }
    while(nodenext->data != dat){
        nodefront = nodenext;
        nodenext  = nodefront->next;
        if(nodenext == NULL){
            printf("链表中无此数据");
            return;
        }
    }
    nodefront->next = nodenext->next;
    free(nodenext);
}

4 主函数中完整代码

int main(){
    LinkList head = CreatList();
    for(int i = 10;i > 0;i--){
        InsertNode_ByHead(head,i);
    }
    PrintList(head);
    printf("=======================================\n");
    DeleteList_PointData(head,8);
    PrintList(head);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值