一、線性表(定義) 線性表(Linear List):是具有相同屬性的數(shù)據(jù)元素的一個有限序列。
它有順序、鏈接、散列等存儲結構,第一元素稱為表頭元素,最后一個元素稱為表尾元素。在任意一對;相鄰結點ai,ai+1(1 線性表的基本特征:若至少含有有一個結點,則除起始結點沒有直接前趨外,其他結點有且僅有一個直接前趨;除終端結點沒有直接后繼外,其他結點有且僅有一個直接后繼。
二、線性表的存儲結構及基本運算 線性表根據(jù)其物理存儲連續(xù)性狀態(tài)及存儲順序可劃分為順序存儲結構和鏈表存儲結構。 順序存儲結構:把線性表中的所有元素按照其邏輯順序依次存儲到計算機存儲器中從指定存儲位置開始的一塊連續(xù)的存儲空間中。
因此,邏輯結構中相鄰的結點在存儲結構中仍相鄰。我們把順序存儲的線性表統(tǒng)稱為順序表,它的順序存儲結構是利用數(shù)組來實現(xiàn)的。
順序存儲下的線性表的基本運算: (1)初始化線性表。即構造一個空表,它的長度(length)置0。
(2)清除線性表中的所有元素。 (3)獲取線性表的長度。
(4)檢查線性表是否為空。 (5)獲取線性表中指定序號的元素。
(6)遍歷線性表。 (7)從線性表查找具有給定值的元素。
(8)更新線性表中具有給定值的元素。 (9)向線性表的末尾添加一個元素。
(10)向線性表的表頭插入一個元素。 (11)向線性表中滿足條件的位置插入一個元素。
(12)從線性表中刪除表頭元素。 (13)從線性表中刪除等于給定值的元素。
(14)對線性表進行排序。 鏈接存儲結構:每一個存儲單位(稱之為存儲結點,簡稱結點),由所存元素本身的信息和元素間邏輯關系信息組成,它可以任意順序存儲任意存儲空間里。
也就是說,鏈接存儲結構不要求元素依次存儲在一塊連續(xù)存儲空間。 采用鏈接存儲結構的線性表稱之為鏈接表。
在進行鏈接存儲時,每個結點除包含元素本身外,若只設置一個引用指向它后面元素(后繼),這樣構成的鏈接表稱之為線性單向鏈接表,簡稱單鏈表。 若設置兩個引用分別指向它前面元素(前驅)和后面的元素(后繼),這樣構成的鏈表稱之為線性雙向鏈接表,簡稱雙向鏈表。
在單鏈表中,若尾結點的后繼不是指向null,而是指頭結點,稱之為循環(huán)鏈表。 鏈表的基本運算: (1)初始化,通過new建立一個空表。
(2)求表長size。線性表的表長等于單嘁鏈表所含表結點的個數(shù)。
(3)按序號查找。鏈表邏輯相鄰的結點并不是存貯在物理相鄰的單元中,所以不能像順序表那樣按序號i查找結點,在鏈表中只能從首結點出發(fā),順后繼next逐個往下搜索,直到找到第i個結點為止。
故鏈表無法實現(xiàn)隨機存取。 (4)定位,即按值查找,也就是從前往后的順序,依次比較各結點數(shù)值域(item)與給定值X相等的結點的序號就是運算幽幽結果,若沒有這樣的結點運算結果為0。
(5)刪除。除了remove(Object o)方法需要先定義,其它各重載remove()方法直接將待刪除結點的item、prev、next置為null,然后修改其前驅的后繼,后繼的前驅,必要是修改first、last。
(6)插入。刪除是unlink,插入是link,基本上刪除的反向操作。
鏈表的其他運算: (1)建表,即將一個線性表中的數(shù)據(jù)元素依次輸入并建立該線性表的單鏈表,也就是初始化運算和插入運算結合應用。 (2)消除重復結點,即刪除數(shù)據(jù)域(item)的值相同的多余結點,只保留其中序號最小的一個。
順序表和鏈表的比較: 1)順序表無需額外空間存儲各結點間關系系,較之鏈表占用存儲空間??; 2)順序表以位置(索引)直接存取各結點,存取方便;插入和刪除時需要移動大量數(shù)據(jù),效率低;鏈表在存取結點時需要從頭結點或尾結點逐一打開后繼或前驅,存取效率較低,而插入和刪除時,只需要修改前驅和后繼,不需要移動數(shù)據(jù),效率較順序表要高。 3)順序表要求占用連續(xù)空間,只能預先分配(靜態(tài)分配),分配空間太大,易造成資源浪費,太小,易造成數(shù)據(jù)溢出;鏈表沒有這方面的要求,存儲空間可以動態(tài)分配,任意修改空間大小。
4)順序表只能存儲線性表,而鏈表除此之外還可以存儲非線性表。 三、棧 棧(Stack)又稱堆棧:是一種運算受限的線性表,其限制是僅允許在表的一端進行插入和刪除運算。
允許進行插入和刪除的一端稱為棧項,另一端稱為棧底。棧項的第一個元素稱為棧頂元素,不含任何數(shù)據(jù)元素的棧稱為空棧。
進棧(也稱入棧),即向一個棧插入新元素,它是把該元素放到棧項元素的上面,使之成為新的棧頂元素。 出棧(或退棧),即從一個棧刪除元素,它是把棧頂元素刪除掉,使其下面相鄰的元素成為新的棧頂元素。
棧的特征(棧的修改原則):后進先出或先進后出(Last In First Out,簡稱LIFO)。 棧有兩種實現(xiàn)方法:順序實現(xiàn)和鏈接實現(xiàn),這和線性表相似。
棧的順序存儲結構稱為順序棧,通常由一個一維數(shù)組(Arrays)實現(xiàn)。棧的鏈式存儲結構稱為鏈棧,可以通過鏈表(LinkedList)實現(xiàn)。
棧的基本運算: (1)初始化棧,構造一個空棧。 (2)清空棧 (3)檢查棧是否為空 (4)讀取棧頂元素 (5)向棧中插入元素 (6)從棧中刪除元素 (7)檢查棧是否已滿(僅適用于順序棧) 四、隊列 隊列(Queue)簡稱隊,也是一種去處受限的線性表,其限制是僅允許在表的一端進。
#include#include#include# define null 0 typedef char ElemType; /* 字符型數(shù)據(jù)*/ typedef struct LNode { ElemType data; struct LNode *next; }; void setnull(struct LNode **p); int length (struct LNode **p); ElemType get(struct LNode **p,int i); void insert(struct LNode **p,ElemType x,int i); int locate(struct LNode **p,ElemType x); void Delete(struct LNode **p,int i); void display(struct LNode **p); struct LNode * reverse(struct LNode **head); main() { struct LNode *head; /*定義變量*/ int select,x1,x2,x3; int i,n; int m,g; char e,y; setnull(&head); /*建一鏈表并設置為空表*/ printf("請輸入數(shù)據(jù)長度: "); scanf("%d",&n); printf("將數(shù)據(jù)插入到單鏈表中: "); for(i=1;i { scanf("%c",&y); if(y=='\n') i--; else { printf("將數(shù)據(jù)插入到單鏈表中: "); insert(&head,y,i); } } /*插入數(shù)據(jù)到鏈表*/ display(&head); /*顯示鏈表所有數(shù)據(jù)*/ printf("select 1 求長度 length()\n"); printf("select 2 取結點 get()\n"); printf("select 3 求值查找 locate()\n"); printf("select 4 刪除結點 delete()\n"); printf("select 5 鏈表反轉 reverse()\n"); printf("input your select: "); scanf("%d",&select); switch(select) { case 1: { x1=length(&head); printf("輸出單鏈表的長度%d\n ",x1); display(&head); }break; case 2: { printf("請輸入要取得結點: "); scanf("%d",&m); x2=get(&head,m); printf("%c\n",x2); display(&head); }break; case 3: { printf("請輸入要查找的數(shù)據(jù): "); scanf("\n%c",&e); x3=locate(&head,e); printf("%d\n",x3); display(&head); }break; case 4: { printf("請輸入要刪除的結點: "); scanf("%d",&g); Delete(&head,g); display(&head); }break; case 5: { printf("鏈表反轉:"); reverse(&head); display(&head); }break; } } void setnull(struct LNode **p) { *p=null; } int length (struct LNode **p) { int n=0; struct LNode *q=*p; while (q!=null) { n++; q=q->next; } return(n); } ElemType get(struct LNode **p,int i) { int j=1; struct LNode *q=*p; while (j { q=q->next; j++; } if(q!=null) return(q->data); else printf("位置參數(shù)不正確!\n"); return null; } int locate(struct LNode **p,ElemType x) { int n=0; struct LNode *q=*p; while (q!=null&&q->data!=x) { q=q->next; n++; } if(q==null) return(-1); else return(n+1); } void insert(struct LNode **p,ElemType x,int i) { int j=1; struct LNode *s,*q; q=*p; s=(struct LNode *)malloc(sizeof(struct LNode)); s->data=x; if(i==1) { s->next=q; *p = s; } else { while(jnext!=null) { q=q->next; j++; } if(j==i-1) { s->next=q->next; q->next=s; } else printf("位置參數(shù)不正確!\n"); } } void Delete(struct LNode **p,int i) { int j=1; struct LNode *q=*p,*t=null; if(i==1) { t=q; *p=q->next; } else { while(jnext!=null) { q=q->next; j++; } if(q->next!=null&&j==i-1) { t=q->next; q->next=t->next; } else printf("位置參數(shù)不正確!\n"); } if(t=null) free(t); } void display(struct LNode **p) { struct LNode *q; q=*p; printf("單鏈表顯示: "); if(q==null) printf("鏈表為空!"); else if (q->next==null) printf("%c\n",q->data); else { while(q->next!=null) { printf("%c->",q->data); q=q->next; } printf("%c",q->data); } printf("\n"); } struct LNode * reverse(struct LNode **head) { struct LNode *p,*q; p=null; while((*head)->next!=null) { q=p; p=*head; (*head)=(*head)->next; p->next=q; }(*head)->next=p; return *head; }。
線性表不僅是指在VF中,任何涉及到數(shù)據(jù)的知識都有線性表:線性表是最基本、最簡單、也是最常用的一種數(shù)據(jù)結構。
線性表中數(shù)據(jù)元素之間的關系是一對一的關系,即除了第一個和最后一個數(shù)據(jù)元素之外,其它數(shù)據(jù)元素都是首尾相接的。線性表的邏輯結構簡單,便于實現(xiàn)和操作。
因此,線性表這種數(shù)據(jù)結構在實際應用中是廣泛采用的一種數(shù)據(jù)結構。 線性表是一種常用的數(shù)據(jù)結構,以下介紹線性表及其順序存儲,并對棧和隊列及它們的順序實現(xiàn)給出了詳細的設計描述。
在實際應用中,線性表都是以棧、隊列、字符串、數(shù)組等特殊線性表的形式來使用的。由于這些特殊線性表都具有各自的特性,因此,掌握這些特殊線性表的特性,對于數(shù)據(jù)運算的可靠性和提高操作效率都是至關重要的。
線性表是一個線性結構,它是一個含有n≥0個結點的有限序列,對于其中的結點,有且僅有一個開始結點沒有前驅但有一個后繼結點,有且僅有一個終端結點沒有后繼但有一個前驅結點,其它的結點都有且僅有一個前驅和一個后繼結點。一般地,一個線性表可以表示成一個線性序列:k1,k2,…,kn,其中k1是開始結點,kn是終端結點。
是一個數(shù)據(jù)元素的有序(次序)集 線性結構的基本特征為: 1.集合中必存在唯一的一個“第一元素”; 2.集合中必存在唯一的一個“最后元素”; 3.除最后一個元素之外,均有唯一的后繼(后件); 4.除第一個元素之外,均有唯一的前驅(前件)。 由n(n≥0)個數(shù)據(jù)元素(結點)a1,a2,…,an組成的有限序列。
數(shù)據(jù)元素的個數(shù)n定義為表的長度。 當n=0時稱為空表。
常常將非空的線性表(n>0)記作: (a1,a2,…an) 數(shù)據(jù)元素ai(1≦i≦n)只是一個抽象的符號,其具體含義在不同的情況下可以不同。 線性表的基本操作 1)Setnull(L)置空表 2)Length(L)求表長度;求表中元素個數(shù) 3)Get(L,i)取表中第i個元素(1≤i≤n) 4)Prior(L,i)取i的前趨元素 5)Next(L,i)取i的后繼元素 6)Locate(L,x)返回指定元素在表中的位置 7)Insert(L,i,x)插入元素 8)Delete(L,x)刪除元素 9)Empty(L)判別表是否為空 線性表具有如下的結構特點: 1.均勻性:雖然不同數(shù)據(jù)表的數(shù)據(jù)元素可以是各種各樣的,但對于同一線性表的各數(shù)據(jù)元素必定具有相同的數(shù)所類長度。
2.有序性:各數(shù)據(jù)元素在線性表中的位置只取決于它們的序與,數(shù)據(jù)元素之前的相對位置是線性的,即存在唯一的“第一個“和“最后一個“的數(shù)據(jù)元素,除了第一個和最后一個外,其它元素前面均只有一個數(shù)據(jù)元素直接前趨和后面均只有一個數(shù)據(jù)元素(直接后繼)。 在實現(xiàn)線性表數(shù)據(jù)元素的存儲方面,一般可用順序存儲結構和鏈式存儲結構兩種方法。
鏈式存儲結構將在本網(wǎng)站線性鏈表中介紹,本章主要介紹用數(shù)組實現(xiàn)線性表數(shù)據(jù)元素的順序存儲及其應用。另外棧.隊列和串也是線性表的特殊情況,又稱為受限的線性結構。
線性表的基本特征是:
1、集合中必存在唯一的一個第一元素。
2、集合中必存在唯一的一個最后元素 。
3、除最后一個元素之外,均有唯一的后繼。
4、除第一個元素之外,均有唯一的前驅。
擴展資料:
線性表主要由順序表示或鏈式表示。在實際應用中,常以棧、隊列、字符串等特殊形式使用。順序表示指的是用一組地址連續(xù)的存儲單元依次存儲線性表的數(shù)據(jù)元素,稱為線性表的順序存儲結構或順序映像。
它以物理位置相鄰來表示線性表中數(shù)據(jù)元素間的邏輯關系,可隨機存取表中任一元素。鏈式表示指的是用一組任意的存儲單元存儲線性表中的數(shù)據(jù)元素,稱為線性表的鏈式存儲結構。
它的存儲單元可以是連續(xù)的,也可以是不連續(xù)的。在表示數(shù)據(jù)元素之間的邏輯關系時,除了存儲其本身的信息之外,還需存儲一個指示其直接后繼的信息,這兩部分信息組成數(shù)據(jù)元素的存儲映像,稱為結點。
參考資料來源:百度百科—線性表
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權,根據(jù)《信息網(wǎng)絡傳播權保護條例》,如果我們轉載的作品侵犯了您的權利,請在一個月內(nèi)通知我們,我們會及時刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學習鳥. 頁面生成時間:2.749秒