小編在正式講解知識的時候不得不吐槽一下這個C語言的鏈表了,真的還是很有難度的,在開始鏈表之前還是先來看下順序表吧。一起來看
首先我們要了解順序表是一種線性的存儲結構,這就夠了。。。。
什麼是表?就是多個成員構成的具有一定聯繫的集合,表中最重要的是具有一定的集合,還要注意各自之間的聯繫。
首先看到成員,我們不得不聯想到C語言的結構體,在結構體裏面定義成員,我們使用的表具有某種聯繫,而且都是相同類型,我們能夠聯想到多個結構體連在一起,這時候就會想到自定義結構體類型(也就是所謂的typedef),結構體和函數聯繫起來當然避免不了函數傳參的應用,也就是指針的使用,這些前面的基礎造就了這個思想的存在,所以還是需要我們好好消化的。話不多說,上代碼
首先在建立C文件後先將能夠用到的頭文件寫出來。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<stdbool.h>
#define DataType int//爲了修改數據方便
我們繼續思考,主函數內部是不是應該自定義結構體類型了
typedef struct SeqList
{
DataType *base;//相當於 int* base
size_t capacity;//size_t = unsigned int 定義結構體的容量
size_t size;// 實際大小
}SeqList;
其實剛開始我也很納悶,這個指針類型爲啥是(int*)類型,這個base指針是用來指向這一段順序空間的,是需要申請出數據空間的。接下來很快就能看見。
就這樣,一個簡單的順序表框架就搭載好了;我們就可以在主函數中進行想要的操作了,接下來我們來看簡單順序表的增刪查改。
首先,進行輸入數據的操作。
存放數據首先需要輸入數據,但是這個函數由很多部分構成的。
我們在主函數中可以這麼操作
Seqlist mylist;
int num;
SeqListInit(&mylist,num);
接下來便是如何書寫這個函數,
先爲你輸入的數據開闢空間
void SeqListInit(Seqlist *psl,int x)//psl是指向這個結構體的指針,x是實際申請容量空間的大小
{
psl->capicity = x > 8 ? x : 8;//8是默認容量空間的大小
psl->base = (int*)malloc(sizeof(Seqlist)*psl->capicity);
psl->size = 0;//將實際大小置零,如果不置零,那麼這個size的值你也不知道,是個垃圾數據,每輸入一個數這和個實際長度就會增加 1
}
每輸入一次數據到下一次輸入前先判斷這個容量還能不能能繼續放入
函數
bool SeqlistIsFull(Seqlist* psl)
{
return psl->size > psl->capicity;//順序表的實際大小和容量比較
}
bool SeqlistIsEmpty(Seqlist* psl)
{
return psl->size ==0;
}
來完整看一下這個尾插函數
bool SeqlistPushBank(Seqlist* psl, int y)
{
if (SeqlistIsFull(psl))
{
printf("順序表已滿,插入失敗\n");
return false;
}
psl->base[psl->size++] = y;
return true;
}
psl->base[psl->size++] = y;這條語句包含的信息非常大
首先
base是個空間,通過下標存儲元素,每次輸入一個數長度加一;
接下來看一下如何將輸入的數據顯示出來
void SeqlsitShow(Seqlist *psl)
{
for (size_t i = 0; i < psl->size; ++i)
{
printf("%d", psl->base[i]);
}
printf("\n");
}
順序表的功能實現還有很大一部分,我們下節再看。