生活随笔
收集整理的這篇文章主要介紹了
Linux C 数据结构---线性表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?數據結構指的是數據元素及數據元素之間的相互關系,包含下面三方面的內容:
?
????其中,線性表是最基本、最簡單、也是最常用的一種數據結構。線性表中數據元素之間的關系是一對一的關系,即除了第一個和最后一個數據元素之外,其它數據元素都是首尾相接的。線性表的邏輯結構簡單,便于實現和操作。因此,線性表這種數據結構在實際應用中是廣泛采用的一種數據結構。
???? 線性表是一個線性結構,它是一個含有n≥0個結點的有限序列,對于其中的結點,有且僅有一個開始結點沒有前驅但有一個后繼結點,有且僅有一個終端結點沒有后繼但有一個前驅結點,其它的結點都有且僅有一個前驅和一個后繼結點。
特征:
1.集合中必存在唯一的一個“第一元素”;
2.集合中必存在唯一的一個 “最后元素” ;
3.除最后一個元素之外,均有 唯一的后繼(后件);
4.除第一個元素之外,均有 唯一的前驅(前件);
??? 線性表作為一種基本的數據結構類型,在計算機存儲器的映像(或表示)一般有兩種形式:
1、順序映像---即我們常用的數組
2、鏈式映像---即我們常用的鏈表
??? 今天,我們先來學習順序存儲結構:
一、順序存儲結構的表示
??? 1、順序存儲結構的特點:
1)邏輯上相鄰的元素A(i) ?A(i+1),其存儲位置也是相鄰的;
2)對數據元素A(i)的存取為隨機存取或地址存取。
3)存儲密度高。存儲密度D=(數據結構中的元素所占存儲空間)/(整個數據結構所占空間)
???? 2、順序存儲結構的不足:
?? ? 對表的插入和刪除等運算的時間復雜度較差。
?????3、順序存儲結構的表示:
在C語言中,一維數組的元素也是存放于一片連續的存儲空間中,故可借助于C語言中一維數組類型來描述線性表的存儲結構,即
[cpp]?view plaincopy
#define?N?100?? ?? typedef?int?data_t;?? typedef?struct?? {?? ????data_t?data[N];?? ????int?last;?? }sqlist_t,*sqlink_t;??
指針 L 指向一個順序表,我們的數據{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,如果是空表{? },此時L->last = -1;
?
下面我們通過一個實例來看線性表基本算法的相關算法如何使用:
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??
執行結果如下:
[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!?
總結
以上是生活随笔為你收集整理的Linux C 数据结构---线性表的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。