C语言单向链表看这一个就够了(包含链表的建立、输出、删除、插入、释放附代码和运行结果)

目录

前言

一、单项链表是什么?

二、单项链表的五大基本操作

1.链表的建立

2.链表的输出

3.链表的删除

4.链表的插入

5.链表的释放

总结



前言

今天凌晨接触结构体时,接触了结构体指针,当时感觉并没有什么鸟用,于是我百度了下,发现其是构建链表的一种非常常用的工具。这里其实有个很容易让编程小白容易误解的地方,即搞混结构体指针和结构体中的指针。结构体指针,指的是结构体的变量,而结构体中的指针是在构建结构体时定义的一个成员,这就是它们的最大区别。于是为了更加了解结构体指针的应用场景,我查看单项链表的相关视频直到凌晨4点,终于小有所成,只是头发也跟着少了几根。结尾附运行结果。

一、单项链表是什么?

单链表是一种链式存取的数据结构,用一组地址任意的储存单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个节点的构成:元素(数据元素的映像)+指针(指示后继元素存储位置),元素就是存储数据的数据单元,指针就是连接每个结点的地址数据。如图所示:

二、单项链表的五大基本操作

1.链表的建立

构建链表的建立的函数需要三个结构体指针,head指针来定义头结点并作为函数的结果return,q指针用来插入新的节点,p指针用来指向新的q节点并在最后指向NULL。值得注意的是建立节点时要通过malloc函数申请动态内存,具体链表建立的函数代码create()如下:

// Created by xsywan4520 on 2023/3/22.
#include <stdio.h>
#include <stdlib.h>
//首先构建结构体
struct list {int num;struct list* next;};
typedef struct list List;
//create函数创建链表返回一个头指针。
List * create() {
    List *head = (List *) malloc(sizeof(List));
    List *p, *q;
    p = head;
    int num;
    while (1) {
        printf("请输入下一个数字(跳出输入0):\n");
        scanf("%d", &num);
        if (num == 0) break;
        q = (List *) malloc(sizeof(List));
        q->num = num;
        p->next = q;
        p = q;
    }
    p->next = NULL;
    return head;
}

2.链表的输出

相信创建一个链表后每个人都迫不及待想看结果,于是就有了用来链表打印的print()函数,输入参数为链表的头结点指针。此时要通过p->next是否为空判断链表是否为空。利用head指针确认链表头结点并通过p指针遍历打印整个链表。

//建立print函数打印链表
void print(List* head) {
    List *p = head;
    if (p->next == NULL) { printf("构建的链表为空链表!"); }
    else {
        printf("相关操作后的链表如下:\n");
        while (p->next != NULL) {
            p = p->next;
            printf("->%d", p->num);
        }
        printf("\n");
    }
}

3.链表的删除

如果你想把某个节点后的节点删除,此时你就需要构建delete函数,输入参数为链表头指针head以及想删除哪个节点后的节点x。如我想删除链表中数字5后的节点。值得注意的是需要对删除后的节点进行内存释放。

//创建delete函数删除第一个数字的链表;
void delete(int x,List *head){
List *p=head,*q;int i=0;
while (p->next!=NULL){
q=p;
p=p->next;
if (p->num==x){
i++;
q->next=p->next;
free(p);
break;
}}
if(i==0){ printf("没有查找到该值,无法进行删除!\n");}
}

4.链表的插入

如果你想在某个数字后插入新的节点,此时你就需要构建insert函数,输入参数为输入一个数字在这个数字y后进行插入z的操作以及需要操作的链表头指针head需要注意的是对于新插入的节点要申请动态内存。

//创建insert函数进行插入,输入一个数字在这个数字y后进行插入z
void insert(int y,int z,List*head){
    List *p=head,*q;int i=0;
    while (p->next!=NULL){
        p=p->next;
        if (p->num==y){
            List *q=(List*) malloc(sizeof (List));
            q->num=z;
            i++;
            q->next=p->next;
            p->next=q;
            break;
        }}
    if(i==0){ printf("没有查找到该值,无法进行插入!\n");}
}

5.链表的释放

在完成所有操作步骤后需要对申请的动态内存进行释放,可以通过一个循环进行遍历释放。

    //进行内存释放
    List *p;
    while (h->next!=NULL){
        p=h;
        h=h->next;
        free(p);
        printf("%d释放成功",h->num);
    }
    return 0;

总结

最后我们尝试对上面5个步骤放进int main()进行运行吧。主函数代码以及运行结果如下:

//主函数
int main(void){
    List *h;int x;int y;int z;
    h=create();
    print(h);
    printf("输入你想删除的值:");
    scanf("%d",&x);
    delete(x,h);print(h);//删除并打印
    printf("输入你想在哪个数后插入以及插入的值(通过,隔开):");
    scanf("%d,%d",&y,&z);
    insert(y,z,h);print(h);//插入并打印
    //进行内存释放
    List *p;
    while (h->next!=NULL){
        p=h;
        h=h->next;
        free(p);
        printf("%d释放成功",h->num);
    }
    return 0;
}

  • 20
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值