生活随笔
收集整理的這篇文章主要介紹了
Linux C 数据结构---线性表
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)元素及數(shù)據(jù)元素之間的相互關(guān)系,包含下面三方面的內(nèi)容:
?
????其中,線性表是最基本、最簡(jiǎn)單、也是最常用的一種數(shù)據(jù)結(jié)構(gòu)。線性表中數(shù)據(jù)元素之間的關(guān)系是一對(duì)一的關(guān)系,即除了第一個(gè)和最后一個(gè)數(shù)據(jù)元素之外,其它數(shù)據(jù)元素都是首尾相接的。線性表的邏輯結(jié)構(gòu)簡(jiǎn)單,便于實(shí)現(xiàn)和操作。因此,線性表這種數(shù)據(jù)結(jié)構(gòu)在實(shí)際應(yīng)用中是廣泛采用的一種數(shù)據(jù)結(jié)構(gòu)。
???? 線性表是一個(gè)線性結(jié)構(gòu),它是一個(gè)含有n≥0個(gè)結(jié)點(diǎn)的有限序列,對(duì)于其中的結(jié)點(diǎn),有且僅有一個(gè)開(kāi)始結(jié)點(diǎn)沒(méi)有前驅(qū)但有一個(gè)后繼結(jié)點(diǎn),有且僅有一個(gè)終端結(jié)點(diǎn)沒(méi)有后繼但有一個(gè)前驅(qū)結(jié)點(diǎn),其它的結(jié)點(diǎn)都有且僅有一個(gè)前驅(qū)和一個(gè)后繼結(jié)點(diǎn)。
特征:
1.集合中必存在唯一的一個(gè)“第一元素”;
2.集合中必存在唯一的一個(gè) “最后元素” ;
3.除最后一個(gè)元素之外,均有 唯一的后繼(后件);
4.除第一個(gè)元素之外,均有 唯一的前驅(qū)(前件);
??? 線性表作為一種基本的數(shù)據(jù)結(jié)構(gòu)類型,在計(jì)算機(jī)存儲(chǔ)器的映像(或表示)一般有兩種形式:
1、順序映像---即我們常用的數(shù)組
2、鏈?zhǔn)接诚?--即我們常用的鏈表
??? 今天,我們先來(lái)學(xué)習(xí)順序存儲(chǔ)結(jié)構(gòu):
一、順序存儲(chǔ)結(jié)構(gòu)的表示
??? 1、順序存儲(chǔ)結(jié)構(gòu)的特點(diǎn):
1)邏輯上相鄰的元素A(i) ?A(i+1),其存儲(chǔ)位置也是相鄰的;
2)對(duì)數(shù)據(jù)元素A(i)的存取為隨機(jī)存取或地址存取。
3)存儲(chǔ)密度高。存儲(chǔ)密度D=(數(shù)據(jù)結(jié)構(gòu)中的元素所占存儲(chǔ)空間)/(整個(gè)數(shù)據(jù)結(jié)構(gòu)所占空間)
???? 2、順序存儲(chǔ)結(jié)構(gòu)的不足:
?? ? 對(duì)表的插入和刪除等運(yùn)算的時(shí)間復(fù)雜度較差。
?????3、順序存儲(chǔ)結(jié)構(gòu)的表示:
在C語(yǔ)言中,一維數(shù)組的元素也是存放于一片連續(xù)的存儲(chǔ)空間中,故可借助于C語(yǔ)言中一維數(shù)組類型來(lái)描述線性表的存儲(chǔ)結(jié)構(gòu),即
[cpp]?view plaincopy
#define?N?100?? ?? typedef?int?data_t;?? typedef?struct?? {?? ????data_t?data[N];?? ????int?last;?? }sqlist_t,*sqlink_t;??
指針 L 指向一個(gè)順序表,我們的數(shù)據(jù){a0,a1,a2........? last};
[cpp]?view plaincopy
sqlink_t?L;?? L?=?(sqlink_t?*)malloc(sizeof(sqlink_t));??
這里我們定義的 int last ,可以表示{? } 、{ a0 }、{a0,a1}、{a0,a1......a99};
ai可以表示為 L->data[i] (0<=i<=L->last),一般情況下,0 < L->last < N,如果是空表{? },此時(shí)L->last = -1;
?
下面我們通過(guò)一個(gè)實(shí)例來(lái)看線性表基本算法的相關(guān)算法如何使用:
seqlist.h
[cpp]?view plaincopy
#ifndef?_SEQ_LIST_H_?? #define?_SEQ_LIST_H_?? ?? #include?"datatype.h"?? ?? #define?MAX?100?? ?? typedef?struct?{?? ????data_t??data[MAX];?? ????int?last;???? ? ? ? ?? }?seqlist_t;?? ?? ? ? ? ? ? ?? seqlist_t?*CreateEmptySqlist();?? ?? ? ? ? ? ? ?? void?DestroySqlist(seqlist_t?*list);?? ?? ? ? ? ? ? ?? void?ClearSqlist(seqlist_t?*list);?? ?? ? ? ? ? ? ? ? ? ?? int?EmptySqlist(seqlist_t?*list);?? ?? ? ? ? ? ? ? ? ? ?? int?FullSqlist(seqlist_t?*list);?? ?? ? ? ? ? ? ? ? ?? int?LengthSqlist(seqlist_t?*list);?? ?? ? ? ? ? ? ? ? ? ? ? ? ? ?? int?GetSqlist(seqlist_t?*list,?int?at,?data_t?*x);?? ?? ? ? ? ? ? ? ? ? ? ? ? ? ?? int?SetSqlist(seqlist_t?*list,?int?at,?data_t?x);?? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? int?InsertSqlist(seqlist_t?*list,?int?at,?data_t?x);?? ?? ? ? ? ? ? ? ? ? ? ? ?? int?DeleteSqlist(seqlist_t?*list,?int?at);?? ?? #endif?/*?_SEQ_LIST_H_?*/??
seqlist.c
[cpp]?view plaincopy
#include?<stdio.h>?? #include?<stdlib.h>?? #include?"seqlist.h"?? ?? seqlist_t?*CreateEmptySqlist()?? {?? ????seqlist_t?*list;?? ????list?=?(seqlist_t?*)malloc(sizeof(seqlist_t));?? ????if(list?!=?NULL)?? ????{?? ????????list->last?=?-1;?? ????}?? ?? ????return?list;?? }?? ?? void?DestroySqlist(seqlist_t?*list)?? {?? ????if?(list?==?NULL)?? ????????return?;?? ?????? ????free(list);?? ?? ????return;?? }?? ?? void?ClearSqlist(seqlist_t?*list)?? {?? ????if?(list?==?NULL)?? ????????return?;?? ?? ????list->last?=?-1;?? ?? }?? ?? int?EmptySqlist(seqlist_t?*list)?? {?? ????if?(list?==?NULL)?? ????????return?-1;?? ?????? ????if(list->last?==?-1)?? ????????return?1;?? ????else?? ????????return?0;?? }?? ?? int?FullSqlist(seqlist_t?*list)?? {?? ????if?(list?==?NULL)?? ????????return?-1;?? ?? ????if?(MAX?-?1?==?list->last)?? ????????return?1;?? ????else?? ????????return?0;?? }?? ?? int?LengthSqlist(seqlist_t?*list)?? {?? ????if?(list?==?NULL)?? ????????return?-1;?? ????else?? ????????return?(list->last?+?1);?? }?? ?? int?GetSqlist(seqlist_t?*list,?int?at,?data_t?*x)??? {?? ????if(list?==?NULL?||?at?<?0?||?at?>?list->last)?? ????????return?-1;?? ?? ????*x?=?list->data[at];?? ?? ????return?0;?? }?? ?? int?SetSqlist(seqlist_t?*list,?int?at,?data_t?x) {?? ????if(list?==?NULL?||?at?<?0?||?(at?>?list->last))?? ????????return?-1;?? ?? ????list->data[at]?=?x;?? ?? ????return?0;?? }?? ?? int?InsertSqlist(seqlist_t?*list,?int?at,?data_t?x)?? {?? ????int?j;?? ????if(list?==?NULL?||?at?<?0?||?FullSqlist(list))?? ????????return?-1;?? ?? ????if(at?>?list->last)?? ????{?? ????????at?=?list->last?+?1;?? ????}?? ????else?? ????{?? ????????for(j?=?list->last;?j?>=?at;?j--)?? ????????{?? ????????????list->data[j+1]?=?list->data[j];?? ????????}?? ????}?? ?? ????list->data[at]?=?x;?? ????list->last++;?? ?? ????return?0;?? }?? ?? int?DeleteSqlist(seqlist_t?*list,?int?at)?? {?? ????int?i;?? ????if(list?==?NULL?||?at?<?0?||?(at?>?list->last))?? ????????return?-1;?? ?? ????for(i?=?at?+?1;?i?<=?list->last;i++)?? ????????list->data[i-1]?=?list->data[i];?? ?? ????list->last--;?? ?? ????return?0;?? }??
main.c
[cpp]?view plaincopy
#include?<stdio.h>?? #include?<stdlib.h>?? #include?"seqlist.h"?? #include?"datatype.h"?? ?? void?iterate_list(seqlist_t?*list)?? {?? ????int?i;?? ?????? ????printf("list.last?=?%d,?list?=?{",?list->last);?? ?????? ????for?(i?=?-1;?i?<?list->last;)?{?? ????????printf("%d,",?list->data[++i]);?? ????}?? ?????????? ????if?(LengthSqlist(list)?>?0)?? ????????printf("\b}\n");?? ????else?? ????????printf("}\n");?? ?? }?? ?? int?main(int?argc,?const?char?*argv[])?? {?? ????int?i;?? ????int?length;?? ????data_t?a[10]?=?{2,4,6,8,10,12,14,16,18,20};?? ????data_t?x;?? ????seqlist_t?*list;?? ????list?=?CreateEmptySqlist();?? ?? ????if?(list?==?NULL)?? ????????return?-1;?? ?? ????for(i?=?0;?i?<?10;i++)?? ????{?? ????????if((InsertSqlist(list,i,a[i]))?<?0)?? ????????????break;?? ????}?? ????iterate_list(list);?? ????length?=?LengthSqlist(list);?? ????printf("The?length?of?the?list?is?%d\n",length);?? ?? ????GetSqlist(list,4,&x);?? ????printf("The?NO.4?data?of?the?list?is?%d\n",x);?? ????SetSqlist(list,4,5);?? ????GetSqlist(list,4,&x);?? ????printf("After?updataing!?The?NO.4?data?of?the?list?is?%d\n",x);?? ?? ????printf("Delete?data[4]!\n");?? ????DeleteSqlist(list,4);?? ????GetSqlist(list,4,&x);?? ????printf("Now?data[4]?=?%d\n",x);?? ????printf("Now?the?legth?of?the?list?is?%d\n",LengthSqlist(list));?? ?? ????ClearSqlist(list);?? ????if(EmptySqlist(list))?? ????????printf("The?list?is?empty!\n");?? ?? ????printf("Now?the?legth?of?the?list?is?%d\n",LengthSqlist(list));?? ?? ????DestroySqlist(list);?? ?? ????printf("The?list?is?destroyed!\n");?? ?? ????return?0;?? }??
makefile:
[cpp]?view plaincopy
OBJS?=?seqlist.o?main.o?? CFLAGS?=?-c?-g?-Wall?? CC?=?gcc?? ?? Test:$(OBJS)?? ????$(CC)?-o?Test?-g?$(OBJS)?? main.o:main.c?seqlist.h?datatype.h?? ????$(CC)?$(CFLAGS)?main.c?? seqlist.o:seqlist.c?seqlist.h?datatype.h?? ????$(CC)?$(CFLAGS)?seqlist.c?? ?? clean:?? ????rm?-rf?Test?*.o??
執(zhí)行結(jié)果如下:
[cpp]?view plaincopy
fs@ubuntu:~/qiang/list$?make?? gcc?-c?-g?-Wall?seqlist.c?? gcc?-c?-g?-Wall?main.c?? gcc?-o?Test?-g?seqlist.o?main.o?? fs@ubuntu:~/qiang/list$?./Test??? list.last?=?9,?list?=?{2,4,6,8,10,12,14,16,18,20}?? The?length?of?the?list?is?10?? The?NO.4?data?of?the?list?is?10?? After?updataing!?The?NO.4?data?of?the?list?is?5?? Delete?data[4]!?? Now?data[4]?=?12?? Now?the?legth?of?the?list?is?9?? The?list?is?empty!?? Now?the?legth?of?the?list?is?0?? The?list?is?destroyed!?
總結(jié)
以上是生活随笔為你收集整理的Linux C 数据结构---线性表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。