c语言链表的建立(非常详细)//关于malloc函数和typedef的一些问题

16 篇文章 3 订阅
7 篇文章 0 订阅

typedef是c语言中一个非常重要的关键字,有很多的用处

1:自定义名称(int char.....)类似于define

如执行下列语句后

typedef int hahaha;

hahaha x;等价于int x;//个人感觉这是一个闲着没事找事干的做法,明明可以直接用int代替,为啥还要在新定义一个呢,可能是为

//了函数移植的方便吧,但是现在的我是感觉不出来有啥好处,可能以后想法会不一样吧

2:结构体的用法,也是我认为最有用的地方

typedef struct seqlist

{

      int size;

      int *next;

};

这样定义就相当于把一个结构体变成了一个类型,即seqlist相当于Int char...,可以进行多种操作如函数建立是作为参数引用

void haha(seqlist *list)相当于void haha(int *list)

动态分配空间

(*l)=(seqlist*)malloc(sizeof(seqlist))//动态分配一个大小为seqlist的空间

对于malloc来说两边的参数只要是个类型就可以了,可以自己定义

 

链表的建立

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

typedef struct node
{
    int data;//数据域,存储数据
    struct node *next//指针域,通过结构体关键字定义存储指针位置信息的结点,?我也不知道为啥非要
//这样定义
}node(可加可不加,加上后格式规范),*linklist;(定义新的结构体变量名,相当于typedef struct node 
//*linklist,之后便可用linklist 来定义新的结构体指针变量

void create_list_tail(linklist *l)//此时必须带上星号
{
    int i,x,j;
    linklist p;//定义一个结构体类型的指针变量,我也有点晕,定义时不带星号
    printf("请输入要创建的元素的个数");
    scanf("%d",&j);
    (*l)=(node*)malloc(sizeof(node))//node在引入参数时就进行了定义,此时分配node个存储空间
    (*l)->next=NULL;//该节点为链表的头结点,后面的结点都要与头结点连接操作,先置空
    printf("请输入\n");
    for(i=0;i<j;i++)
    {
        scanf("%d",&x);
        p=(node*)malloc(sizeof(node));
        p->data=x;
        p->next=(*l)->next;//这两步为重要步骤,l作为头结点始终在最前面,每一个新插入的结点都在
        (*l)->next=p;//头结点和后一个结点中间所以最后插入完成后的格式为
//头--3--2--1
    }
}

void print_list(linklist l)//打印输出,此时可以不带星号
{
    linklist p;
    p=l->next;//因为l为头结点所以数据域为空,要在下一个节点进行循环
    while(p)//条件成立时
    {
        printf("%d",p->data);
        p=p->next;//不断的遍历,朝下一个节点移动
    }
}

void create_list_tail(linklist *l)//尾插法建立,为正序
{
    int i,j,x;
    linklist p,r;
    (*l)=(node*)malloc(sizeof(node))
    (*l)->next=NULL;

    printf("请输入要创建链表的元素的个数");
    scanf("%d",&j);
    r=*l;//r需要不断变化,且最终要变为参数,所以要用不同的
    for(i=0;i<j;i++)
    {
        scanf("%d",&x);
        p=(node*)malloc(sizeof(node))
        p->data=x;
        r->next=p;//该段的意义是可以不断的往后添加
        r=p;    
    }
r->next=NULL;
}
    
    

 对于头插法,顾名思义就是不断地朝头部插入,

l --a4--a3--a2--a1--a0

p->next=(*l)->next;

(*l)->next=p;

 第一次把p放到l的后面

第二次的p又放到l后面

.........

所以就变成了头插法

尾插法

第一次把p放到r的后面,p变成r

第二次把p放到r的后面,p变成r

..........

完成后不要忘记最后一个结点变成空节点

 

 

 

  • 13
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值