2.c语言数据结构-----单链表(写单链表)

本文介绍了无头单链表和有头单链表的基本概念,包括它们的结构、创建过程以及在VSCode环境下使用Linux命令进行编译。重点讲述了如何在C语言中创建链表,包括节点的定义、链表的创建函数以及打印链表的操作。
摘要由CSDN通过智能技术生成

1.线性表的顺序结构就是    数组

2.链表概念:

        有一个或多个含有指针成员变量的结构体,通过其指针成员的地址指向形成逻辑上的链式结构

链表的优点:方便插入和删除元素,不方便存取(存取是数组的优点)

这里使用的是vscode软件

环境:链接了虚拟机VM,编译使用linux命令

开始代码:

---无头单链表---

1.创建对应的 .c  .h文件

2.开始在link_list.h文件写

2.1 创建结点结构体

#ifndef __LINK_LIST_H__
#define __LINK_LIST_H__


typedef int DataType;//typedef作用相当于改名,将int改成DataType

//写结构体,也就是链表中的一般节点
struct node
{

    DataType data;//数据域
    struct node *next;//指针域
}



#endif

2.2 创建链表的函数

#ifndef __LINK_LIST_H__
#define __LINK_LIST_H__


typedef int DataType;//typedef作用相当于改名,将int改成DataType

//写结构体,也就是链表中的一般节点
struct node
{

    DataType data;//数据域
    struct node *next;//指针域
}

struct node * create_link_list();//创建链表

#endif

3. 在link.c中完善创建链表的函数

#include <stdio.h>
#include <stdlib.h>
#include "link_list.h"
struct node * create_link_list()
{
    DataType d;
    struct node *head=NULL;//创建头节点
    struct node *tail=NULL;//创建尾节点
    struct node *pnew=NULL;//创建新节点
    while (1)
    {
        scanf("%d",&d);
        if (d==0)
        {
            break;
        }
        pnew=malloc(sizeof(struct node));//给结构体分配空间
        //完善结点相关信息
        pnew->data=d;
        pnew->next=NULL;
        
        if(head==NULL)//从无到有
        {
            head=pnew;
            tail=pnew;
        }
        else
        {
            //头插法
            pnew->next=head;
            head=pnew;//更新头结点
            // //尾插法
            // tail->next=pnew;
            // tail=pnew;//更新尾节点
        }
    }
    return head;
};

图示链表插入的过程

3.1 在link_list.c写一个打印链表元素的函数,link_list.h声明

void printf_link_list(struct node *L)//打印链表中的元素
{
    while (L)
    {
        printf("%d ",L->data);
        L=L->next;
    }
    printf("\n");
    
}

4.main.c 文件

#include <stdio.h>
#include "link_list.h"
int main()
{
    struct node * L;
    L=create_link_list();
    printf_link_list(L);
    return 0;
}

5.编译成功,main函数

6.运行成功

7.后面还有增删查改功能

---有头单链表---

推荐对无头链表熟练后再看,相对无头链表而言,有头链表仅仅只是多了几行代码而已

1.创建文件

2.在head_link_list.h中写入节点的结构体和头结点的结构体,声明创建链表和打印链表的函数

#ifndef __HEAD_LINK_LIST_H__
#define __HEAD_LINK_LIST_H__

typedef int DataType;

//创建头结点
struct head_list
{
    int nodenum;//节点数量
    struct node * first;//头指针
    struct node * last;//尾指针
};


//创建一般节点
struct node
{
    DataType data;//数据域
    //指针域
    struct node * next;
};

struct head_list * create_head_link_list();//创建链表
void printf_head_link_list(struct head_list *L);//打印链表
#endif

到这里,基本可以看到与前面的无头单链表仅仅只是多了一个结构体

3.在head_link_list.c中完善相关函数

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

struct head_list * create_head_link_list()
{
    DataType d;
    // struct head_list *L;//error错误写法
    
    //为头结点申请空间
    struct head_list *L=(struct head_list*)malloc(sizeof(*L));
    //完善结构体头结点的初始化
    L->nodenum=0;
    L->first=NULL;
    L->last=NULL;
    //新创建的节点pnew
    struct node *pnew=NULL;
    while (1)
    {
        scanf("%d",&d);
        if (d==0)//输入0时结束
        {
            break;
        }
        //为pnew申请空间,并完善结构体节点的初始化
        pnew=malloc(sizeof(*pnew));
        pnew->data=d;
        pnew->next=NULL;
        //将节点放入链表中
        //从无到有
        if(L->first==NULL)
        {
            L->first=pnew;
            L->last=pnew;
        }
        //少到多
        else
        {
            //头插法
            pnew->next=L->first;
            L->first=pnew;
            //尾插法
            // L->last->next=pnew;
            // L->lasst=pnew;
        }
        L->nodenum++;
    }
    return L;
};

//打印链表
void printf_head_link_list(struct head_list *L)
{
    struct node *p=L->first;
    while (p)
    {
        printf("%d ",p->data);
        p=p->next;//指针后移
    }
    printf("\n");

}

这里可以看到与前面的无头单链表相比,多了一个新节点要申请空间,完善消息

4.main.c文件

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

int main()
{
    struct head_list *L;
    L=create_head_link_list();//创建链表
    printf_head_link_list(L);
    return 0;
}

5.编译成功 在终端运行命令gcc *.c -o main

6.运行成功   ./main

7.后面还有增删查改功能

  • 31
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值