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
..........
完成后不要忘记最后一个结点变成空节点