c语言数据结构1——线性表链式存储_线性表链式存储比较函数

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

4.1;头插法;

//头插法创建链表; 接下来的节点都是直接插到head后面,其余之前创建的节点之前;因此会改变顺序; 
//这里的s是没有变化的,始终指向的是刚创建的节点,达到头插法的目的;
//}
void creat2(struct node * s, int num)//用结构体指针指向head,达到通过s来创建链表; 
{
    if(num <= 0)
    {
        printf("输入的节点数不对\n");
        exit(1);
    }
    struct node * p, *p1;
    int i; 
    p = (struct node *)malloc(sizeof(struct node));//先创建第一个节点;并赋值; 
    if(p == NULL)
    {
        exit(1);
    }
    scanf("%d",&p->data);
    p->next = NULL;//最后一个节点的next要为NULL; 
    s->next = p;//将创建并赋值的节点p连接到head上。 
    for(i = 1; i <= num-1; i++)//相同操作,创建节点赋值连接到head后面,只是每个新节点都直接放到head后面, 
    {
        p1 = (struct node *)malloc(sizeof(struct node));
        if(p1 == NULL)
        {
            printf("未正常分配内存");
            exit(1);
        }
        scanf("%d",&p1->data);
        p1->next = p;//新创建的节点next指向前一个建立的节点; 
        s->next = p1;//head的next指向新创建的节点, 
        p = p1;//把新创建的节点变成下一个要创建节点的前一个节点; 
    }
    //这里的最后节点next赋值NULL只能放到最前面赋值,因为第一个创建的节点就是链表最后一个节点; 
}

4.2;尾插法;

//尾插法创建链表; 接下来的节点是按顺序依次接到前个节点的后; 
//这里s的作用是移动,每次都是指向刚创建完的节点,也就是指向即将创建的节点的前一个节点,尾连接的目的 
void creat1(struct node * s, int num)//用结构体指针指向head,达到通过s来创建链表; 
{
    if(num <= 0)
    {
        printf("输入的节点数不对\n");
        exit(1);
    }
    struct node * p;
    int i; 
    for(i = 1; i <= num; i++)
    {
        p = (struct node *)malloc(sizeof(struct node));
        if(p == NULL)//注意不能丢,使用malloc就要判断是否成功; 
        {
            exit(1);
        }
        scanf("%d",&p->data);
        s->next = p;//将s的next执行刚创建的节点;达到连接节点的作用 
        s = p;//s执行刚创建的节点; 
    }
    s->next = NULL;//表示最后一个节点的next指向NULL。 
}

5;链表的遍历输出;

main方法里面;
printf("原链表节点\n");
print(&head,n); 

//依次遍历链表并输出; 
void print(const struct node \*s,int n)
{
    int i;
    for(i = 1; i <= n; i++)//遍历; 
    {
        s = s->next;//移动指针进行遍历输出;
        printf("第%d节点数据域为%d\n",i, s->data);
    }
}

6;关于对链表节点查询;有两种一个是对值的查询,一个是对节点序号的查询;
6.1;

main方法里面的;
/* 测试按值查找 
    printf("输入要查找的值\n");
    scanf("%d",&data1);
    getdata(&head,data1);
    \*/
//按值查找链表; 
void getdata(const struct node * s , Elem data1) 
{
    int k = 0,flag = 0;
    while(s->next != NULL)//遍历链表,到最后一个节点NULL
    {
        s = s->next;
        k++;
        if(s->data == data1)//进行比较查找
        {
            flag = 1;
            printf("%d ",k);
        }   
    }
    if(flag == 0)
    {
        printf("在该链表中没有找到%d",data1);
    }
    printf("\n");
}

6.2;

//main方法里面的
/* 测试返回第num个节点的数据域; 
    printf("输入要查找数据域节点的标号\n");
    scanf("%d",&num);
    getlocate(&head,num);
    \*/ 
//输出某个节点的数据域;
void getlocate(const struct node \*s, int num)
{
    if(num <= 0 || num > getlen(s))
    {
        printf("输入的节点数不对\n");
        exit(1);
    }
    int i;
    for(i = 1; i <= num; i++)//遍历到,是s指向第num个节点;
    {
        s = s->next;
    }
    printf("该链表的第%d的节点的数据域为%d\n",num,s->data);

} 

7,返回链表长度;

调用的方法;
getlen(&head);


//计算链表的长度;
//指针s是变化的,遍历整个链表,链表结束的标志就是最后一个节点的next为NULL; 
int getlen(const struct node * s)
{
    int num = 0;
    while(s->next != NULL)//遍历; 
    {
        s = s->next;
        num++; 
    }
    return num;
}

8;删除节点的操作;
8.1;

main方法里面;
    /\*验证删除函数;delete1(&head,num); 
    printf("输入要删除节点的节点号\n");
    scanf("%d",&bh1);
    delet1(&head,bh1);
    printf("删除第%d个节点后的链表\n",bh1);
    print(&head,n-1); 
    \*/
//删除链表的第num个节点; 
//指针s是变化的,最初是指向head的,后面指向num节点前的一个节点, 
void delet1(struct node * s, int num)
{
    if(num <= 0 || num > getlen(s))
    {
        printf("输入的节点数不对\n");
        exit(1);
    }
    struct node \*p1;
    int i;
    for(i = 1; i <= num-1; i++)//遍历s指向第num节点的前一个节点 
    {
        s = s->next;
    }
    p1 = s->next;//将要p1指向要删除的节点,为后续释放空间做准备; 
    s->next = s->next->next;//到达删除目的,删除节点前的节点的next指向删除节点后的节点; 
    free(p1);//释放空间。 
}

8.2;删除一段节点

main函数中;
/\*测试删除一段节点的函数 
    printf("输出要删除的节点区域\n");
    scanf("%d %d",&st,&end);
    delet2(&head,st,end); 
    printf("输出删除节点后的链表\n");
    print(&head,n-(end-st));
    \*/
//删除一段区间的节点;从num1到num2,包前不包为,删除num1不删除num2; 
void delet2(struct node \*s, int num1, int num2)
{
    ListNode * p, * p1;
    int i;
    if(num1 > num2)
    {
        printf("输入的两个节点序号顺序有错\n");  
    }
    pd(s,num1);
    pd(s,num2);
    for(i = 1; i < num2; i++)
    {
        if(i == num1) 
        {
            p = s; 
        }
        s = s->next;//先判断再移动; 
    } 
    p1 = s->next;
    p->next = p1;
}

9;插入函数;

main方法里面;
    /* 验证插入函数,insert(&head,num);
    printf("输入要插入到节点后的节点号\n");
    scanf("%d",&bh2);
    insert(&head,bh2);
    print(&head,n+1);


**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/937ca48b5e652c9886a19042ac0d70f4.png)
![img](https://img-blog.csdnimg.cn/img_convert/4f0e1d1a522bee29dc8e4a666df29a9f.png)

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

N2KqDHt-1715866669501)]
[外链图片转存中...(img-hhT4PIWp-1715866669501)]

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值