“说了这么多,数据结构用代码到底怎么写?”
我们知道,C语言可以用结构体,来描述一个复杂的数据类型。
结构体是个啥东西?
可以看下上一篇文噢
01
—
顺序表
我们知道,顺序表,可以用一个数组来存放顺序表里面的各个元素。
于是,我们可以这样定义一个顺序表的数据结构:
#defineMaxSize50typedefintElemType;typedefstruct{ElemTypedata[MaxSize];//存放顺序表元素intlength;//存放顺序表的长度}SqList;//顺序表的类型
如何建立一个顺序表?
voidCreateList(SqList*L,ElemTypea[],intn){L=(SqList*)malloc(sizeof(SqList));for(inti=0;in;i++)L-data=a;L-length=n;}
以下是代码解析,
CreateList是一个函数,用来创建一个空的顺序表,
传入两个变量,一个是顺序表的指针,一个是顺序表的长度。
首先,申请一块顺序表结构大小的空间,
在这里,sizeof(SqList)会返回SqList结构需要占用的内存空间大小,
malloc则是申请指定大小的内存空间,
申请到的内存空间,它是什么类型的?
所以在malloc前面进行了强制类型转换,加了一个(SqList*)。
L=(SqList*)malloc(sizeof(SqList));
再根据指定好的顺序表长度,对顺序表数组进行初始化。
所以这里用了一个for循环。
for(inti=0;in;i++)L-data=a;
循环结束,L里面的数组的所有元素,都被初始化了一个初始值了。
于是再指定新创建线性表的length属性。
L-length=n;
02
—
单链表
链表有什么东西?
有一个头指针,
有一个一个的链表节点。
链表节点里面有什么东西?
有这个节点存放的data,数据信息,
有这个节点的下一个节点的指针next。
于是我们可以这样写:
typedefintElemType;typedefstructLNode{ElemTypedata;structLNode*next;//指向后继结点}LinkNode;//声明单链表结点类型
如何创建一个单链表?
单链表整活更厉害一点,
我们有两个方法,头插法,和尾插法。
头插法
首先创建一个新的节点,把数据放入新的节点中;
然后将新节点的next指向链表头结点的next指向的节点,
也就是链表第一个数据节点;
然后修改头结点的next域,使之指向新节点。
于是可以这样写:
//头插法建立单链表voidCreateListF(LinkNode*L,ElemTypea[],intn){LinkNode*s;L=(LinkNode*)malloc(sizeof(LinkNode));//创建头结点L-next=NULL;for(inti=0;in;i++){s=(LinkNode*)malloc(sizeof(LinkNode));//创建新结点s-data=a;s-next=L-next;//将新结点插在原开始结点之前,头结点之后L-next=s;}}
然后就是尾插法,尾插法更简单点,
首先创建一个新的节点,把数据放入新的节点中;
然后将链表的最后一个节点的next域指向新节点就行了。
所以我们这样写:
//尾插法建立单链表voidCreateListR(LinkNode*L,ElemTypea[],intn){LinkNode*s,*r;L=(LinkNode*)malloc(sizeof(LinkNode));//创建头结点L-next=NULL;r=L;//r始终指向终端结点,开始时指向头结点for(inti=0;in;i++){s=(LinkNode*)malloc(sizeof(LinkNode));//创建新结点ss-data=a;r-next=s;//将结点s插入结点r之后r=s;}r-next=NULL;//终端结点next域置为NULL}
如果觉得有用,不点个再看么少年?↓[]~( ̄▽ ̄)~*
小冰冲冲冲