第一篇:數據結構實驗報告三線性表的鏈式存儲
實驗報告三 線性表的鏈式存儲
班級: 2010XXX 姓名: HoogLe 學號: 2010XXXX 專業: XXXX
2858505197@qq.com
一、實驗目的:
(1)掌握單鏈表的基本操作的實現方法。(2)掌握循環單鏈表的基本操作實現。(3)掌握兩有序鏈表的歸并操作算法。
二、實驗內容:(請采用模板類及模板函數實現)
1、線性表鏈式存儲結構及基本操作算法實現
[實現提示](同時可參見教材p64-p73頁的ADT描述及算法實現及ppt)函數、類名稱等可自定義,部分變量請加上學號后3位。也可自行對類中所定義的操作進行擴展。所加載的庫函數或常量定義: #include
LinkList(T a[],int n);//利用數組初始化帶頭結點的單鏈表構造函數實現
~LinkList();int length();//求單鏈表表長算法
T get(int i);//獲得單鏈表中第i個結點的值算法
int locate(T temp);void insert(int i,T temp);//在帶頭結點單鏈表的第i個位置前插入元素e算法
T Delete(int i);//在帶頭結點單鏈表中刪除第i個元素算法
void print();//遍歷單鏈表元素算法
bool isEmpty();//判單鏈表表空算法
void deleleAll();//刪除鏈表中所有結點算法(這里不是析構函數,但功能相同)private: Node
前置條件:無
動作:初始化一個帶頭結點的空鏈表 輸出:無
后置條件:頭指針指向頭結點。
//初始化帶頭結點空單鏈表構造函數實現 template
(3)利用數組初始化帶頭結點的單鏈表構造函數實現 輸入:已存儲數據的數組及數組中元素的個數 前置條件:無
動作:利用頭插或尾插法創建帶頭結點的單鏈表 輸出:無
后置條件:頭指針指向頭結點,且數組中的元素為鏈表中各結點的數據成員。//利用數組初始化帶頭結點的單鏈表構造函數實現 template
動作:在帶頭結點的單鏈表中第i個位置之前插入元素e 輸出:無
后置條件:單鏈表中增加了一個結點
//在帶頭結點單鏈表的第i個位置前插入元素e算法 template p=p->next; count++;} if(p==NULL)cout<<“i不合法,越界!”;else{ Node s->data = temp; s->next = p->next; p->next = s;} }(5)在帶頭結點單鏈表中刪除第i個元素算法 輸入:刪除第i個結點,待存放刪除結點值變量e 前置條件:單鏈表不空,i的值要合法 動作:在帶頭結點的單鏈表中刪除第i個結點,并返回該結點的值(由e傳出)。輸出:無 后置條件:單鏈表中減少了一個結點 //在帶頭結點單鏈表中刪除第i個元素算法 template p=p->next; count++;} if(p==NULL)cout<<“i不合法,越界!”;else{ Node T x= s->data; p->next = s->next; return x;} }(6)遍歷單鏈表元素算法 輸入:無 前置條件:單鏈表不空 動作:遍歷輸出單鏈表中的各元素。輸出:無 后置條件:無 //遍歷單鏈表元素算法 template cout< data<<“ ”; p=p->next;} cout< (7)求單鏈表表長算法。輸入:無 前置條件:無 動作:求單鏈表中元素個數。輸出:返回元素個數 后置條件:無 //求單鏈表表長算法 template p=p->next; count++;} return--count;} (8)判單鏈表表空算法 輸入:無 前置條件:無 動作:判表是否為空。 輸出:為空時返回1,不為空時返回0 后置條件:無 //判斷非空 template (9)獲得單鏈表中第i個結點的值算法 輸入:無 前置條件:i不空,i合法 動作:找到第i個結點。 輸出:返回第i個結點的元素值。后置條件:無 //獲得單鏈表中第i個結點的值算法 template p=p->next; count++;} if(p==NULL)cout<<“i不合法,越界!”;else{ return p->data;} } (10)刪除鏈表中所有結點算法(這里不是析構函數,但功能相同)輸入:無 前置條件:單鏈表存在 動作:清除單鏈表中所有的結點。輸出:無 后置條件:頭指針指向空 //刪除所有元素 template Node p=p->next; t->next=NULL;} } (11)上機實現以上基本操作,寫出main()程序: 參考p72 void main(){ int a[10]={1,2,3,4,5,6,7,8,9,0};//測試帶參數的構造函數(前端插入!) LinkList if(list1.isEmpty()){ cout<<“鏈表不為空!”< cout<<“鏈表為空!”< 2、參考單鏈表操作定義與實現,自行完成單循環鏈表的類的定義與相操作操作算法。template void insert(int i,T temp);//在帶頭結點單循環鏈表的第i個位置前插入元素e算法 T Delete(int i);//在帶頭結點單循環鏈表中刪除第i個元素算法 void print();//遍歷單循環鏈表元素算法 private: Node 動作:利用頭插或尾插法創建帶頭結點的單循環鏈表 輸出:無 后置條件:頭指針指向頭結點,且數組中的元素為鏈表中各結點的數據成員,尾指針指向頭結點。 //利用數組初始化帶頭結點的單循環鏈表構造函數實現 template s->next = head->next;head->next=s; length++;} } (2)在帶頭結點單循環鏈表的第i個位置前插入元素e算法 輸入:插入位置i,待插入元素e 前置條件:i的值要合法 動作:在帶頭結點的單循環鏈表中第i個位置之前插入元素e 輸出:無 后置條件:單循環鏈表中增加了一個結點 //在帶頭結點單循環鏈表的第i個位置前插入元素e算法 template while(count p=p->next; count++; } Node s->data = temp; s->next = p->next; p->next = s;} }(3)在帶頭結點單循環鏈表中刪除第i個元素算法 輸入:刪除第i個結點,待存放刪除結點值變量e 前置條件:單循環鏈表不空,i的值要合法 動作:在帶頭結點的單循環鏈表中刪除第i個結點,并返回該結點的值(由e傳出)。輸出:無 后置條件:單循環鏈表中減少了一個結點 //在帶頭結點單循環鏈表中刪除第i個元素算法 template if(i>length)cout<<“i不合法,越界!”< while(count p=p->next; count++; } Node T x= s->data; p->next = s->next; return x;} } (4)遍歷單循環鏈表元素算法 輸入:無 前置條件:單循環鏈表不空 動作:遍歷輸出單循環鏈表中的各元素。輸出:無 后置條件:無 //遍歷單循環鏈表元素算法 template cout< data<<“ ”; p=p->next;} cout< (5)上機實現以上基本操作,寫出main()程序: void main(){ int a[10]={1,2,3,4,5,6,7,8,9,0};//測試帶參數的構造函數(前端插入!) LinkList 3、采用鏈式存儲方式,并利用單鏈表類及類中所定義的算法加以實現線性表La,Lb為非遞減的有序線性表,將其歸并為新線性表Lc,該線性表仍有序(未考慮相同時刪除一重復值)的算法。模板函數: template if(p1->data>p2->data) { this->insert(++num,p1->data); p1=p1->next; } else{ this->insert(++num,p2->data); p2=p2->next; } } if(!p1){ p1=p2;} while(p1){ this->insert(++num,p1->data); p1=p1->next;} } void main(){ int a[5]={1,2,5,6,9};int b[5]={0,3,4,7,8};LinkList 選做題: 1、按一元多項式ADT的定義,實現相關操作算法: ADT PNode is Data 系數(coef)指數(exp)指針域(next):指向下一個結點 Operation 暫無 end ADT PNode ADT Polynomial is Data PNode類型的頭指針。Operation Polynomail 初始化值:無 動作:申請頭結點,由頭指針指向該頭結點,并輸入m項的系數和指數,建立一元多項式。 DestroyPolyn 輸入:無 前置條件: 多項式已存在 動作:消毀多項式。輸出:無 后置條件:頭指針指向空 PolyDisplay 輸入:無 前置條件: 多項式已存在,不為空 動作:輸出多項式各項系數與指數 輸出:無 后置條件:無 AddPoly 輸入:另一個待加的多項式 前置條件:一元多項式pa和pb已存在。動作及后置條件:完成多項式相加運算,(采用pa=pa+pb形式,并銷毀一元多項式pb)輸出:無 end ADT Polynomial 2、實現一元多項式的減法,操作描述如下: SubPoly 輸入:待減的多項式pb 前置條件:一元多項式pa和pb已存在。 動作及后置條件:完成多項式減法運算,即:pa=pa-pb,并銷毀一元多項式pb。輸出:無 3、參考P74-P79頁雙向鏈表的存儲結構定義及算法,編程實現雙向鏈表的插入算法和刪除算法。 三、心得體會:(含上機中所遇問題的解決辦法,所使用到的編程技巧、創新點及編程的心得) 實驗報告 課程名稱:數據結構與算法分析 實驗名稱:鏈表的實現與應用 實驗日期:2015.01.30 班級: 數媒1401 姓名: 范業嘉 學號 1030514108 一、實驗目的 掌握線性表的鏈式存儲結構設計與基本操作的實現。 二、實驗內容與要求 ⑴定義線性表的鏈式存儲表示; ⑵基于所設計的存儲結構實現線性表的基本操作; ⑶編寫一個主程序對所實現的線性表進行測試; ⑷線性表的應用:①設線性表L1和L2分別代表集合A和B,試設計算法求A和B的并集C,并用 線性表L3代表集合C;②(選做)設線性表L1和L2中的數據元素為整數,且均已按值非遞減有序排列,試設計算法對L1和L2進行合并,用線性表L3保存合并結果,要求L3中的數據元素也按值非遞減有序排列。 ⑸設計一個一元多項式計算器,要求能夠:①輸入并建立多項式;②輸出多項式;③執行兩個多項式相加;④執行兩個多項式相減;⑤(選做)執行兩個多項式相乘。 三、數據結構設計 1.按所用指針的類型、個數、方法等的不同,又可分為: 線性鏈表(單鏈表) 靜態鏈表 循環鏈表 雙向鏈表 雙向循環鏈表 2.用一組任意的存儲單元存儲線性表中數據元素,用指針來表示數據元素間的邏輯關系。 四、算法設計 1.定義一個鏈表 void creatlist(Linklist &L,int n){ int i;Linklist p,s;L=(Linklist)malloc(sizeof(Lnode));p=L;L->next=NULL;for(i=0;i s=(Linklist)malloc(sizeof(Lnode)); scanf(“%d”,&s->data); s->next=NULL; p->next=s; p=s; / 8 } } 2.(1)兩個鏈表的合并 void Mergelist(Linklist &La,Linklist &Lb,Linklist &Lc){ Linklist pa,pb,pc;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){ if(pa->data<=pb->data) {pc->next=pa;pc=pa;pa=pa->next;} else {pc->next=pb;pc=pb;pb=pb->next;} } pc->next=pa?pa:pb;free(Lb);}(2)兩個鏈表的并集 Linklist unionlist(Linklist &La,Linklist &Lb){ Linklist p1,p2,head,q,s;int flag;head=q=(Linklist)malloc(sizeof(Lnode));p1=La->next;while(p1){ flag=0; p2=Lb->next; while(p2) { if(p1->data==p2->data) { flag=1; break; } p2=p2->next; } if(flag==0) { s=(Linklist)malloc(sizeof(Lnode)); s->data=p1->data; q->next=s; q=s; } p1=p1->next;/ 8 } q->next=Lb->next;return head; } 3.(1)一元多項式的加法 List addpoly(List pa,List pb) //一元多項式的加法 { int n;List pc,s,p;pa=pa->next;pb=pb->next;pc=(List)malloc(sizeof(struct Linklist));pc->next=NULL;p=pc;while(pa!=NULL&&pb!=NULL){ if(pa->expn>pb->expn) { s=(List)malloc(sizeof(struct Linklist)); s->expn=pa->expn; s->coef=pa->coef; s->next=NULL; p->next=s; p=s; pa=pa->next; } else if(pa->expn expn) { s=(List)malloc(sizeof(struct Linklist)); s->expn=pb->expn; s->coef=pb->coef; s->next=NULL; p->next=s; p=s; pb=pb->next; } else { n=pa->coef+pb->coef; if(n!=0) { s=(List)malloc(sizeof(struct Linklist)); s->expn=pa->expn;/ 8 s->coef=n; s->next=NULL; p->next=s; p=s; } pb=pb->next; pa=pa->next; } } while(pa!=NULL){ s=(List)malloc(sizeof(struct Linklist)); s->expn=pa->expn; s->coef=pa->coef; s->next=NULL; p->next=s; p=s; pa=pa->next;} while(pb!=NULL){ s=(List)malloc(sizeof(struct Linklist)); s->expn=pb->expn; s->coef=pb->coef; s->next=NULL; p->next=s; p=s; pb=pb->next;} return pc;} (2)一元多項式的減法 List subpoly(List pa,List pb) //一元多項式的減法 { int n;List pc,s,p;pa=pa->next;pb=pb->next;pc=(List)malloc(sizeof(struct Linklist));pc->next=NULL;p=pc;while(pa!=NULL&&pb!=NULL){ if(pa->expn>pb->expn) / 8 { s=(List)malloc(sizeof(struct Linklist)); s->expn=pa->expn; s->coef=pa->coef; s->next=NULL; p->next=s; p=s; pa=pa->next;} else if(pa->expn expn){ s=(List)malloc(sizeof(struct Linklist)); s->expn=pb->expn; s->coef=-pb->coef; s->next=NULL; p->next=s; p=s; pb=pb->next;} else { n=pa->coef-pb->coef; if(n!=0) { s=(List)malloc(sizeof(struct Linklist)); s->expn=pa->expn; s->coef=n; s->next=NULL; p->next=s; p=s; } pb=pb->next; pa=pa->next;} } while(pa!=NULL){ s=(List)malloc(sizeof(struct Linklist));s->expn=pa->expn;s->coef=pa->coef;s->next=NULL;p->next=s;p=s;pa=pa->next;} / 8 while(pb!=NULL){ s=(List)malloc(sizeof(struct Linklist)); s->expn=pb->expn; s->coef=-pb->coef; s->next=NULL; p->next=s; p=s; pb=pb->next;} return pc;}(3)一元多項式的乘法 void mulpolyn(polynomail pa,polynomail pb,polynomail &pc){ LNode *p,*q,*s,*hc;p=pa->next;q=pb->next;hc=pc;while(p!=NULL){ while(q!=NULL) { s=(polynomail)malloc(sizeof(LNode)); hc->next=s; hc=hc->next; hc->coef=q->coef*p->coef; hc->expn=q->expn+p->expn; q=q->next; } p=p->next; q=pb->next;} hc->next=NULL;} / 8 五、測試結果 2.3.7 / 8 六、心得體會(包括對于本次實驗的小結,實驗過程中碰到的問題等) 1.首先書上給的鏈表輸入是倒序的,寫的時候想都沒想就抄上去了,結果運行時發現問題,可是上網百度依然沒有把問題解決,導致最后輸出鏈表倒序的,并且鏈表的合并并集依舊是倒序的。 2.當寫一元多項式的加減時,前提是弄清楚各種情況,系數相同時就相加減,系數不同就保留原有多項式;當系數相加減為0時,就free這個節點。在做減法時,我考慮到了減數與被減數之間的關系。 3.在做多項式時,我準備按照書上的算法一個一個寫小函數,結果到最后發現寫不下去了,就去問問同學和上網看看,結果感覺寫這個數據結構的程序其實不必想麻煩了,只是指針,數組的高級運用。 / 8 實驗報告二 線性表的順序存儲 班級: 2010XXX 姓名: HoogLe 學號: 2010XXXX 專業: XXXX 2858505197@qq.com 一、實驗目的: (1)掌握順序表的基本操作的實現方法。 (2)應用順序表的基本算法實現集合A=AUB算法。 (3)應用順序表的基本算法實現兩有序順序表的歸并算法。 二、實驗內容: 1、線性表順序存儲結構的基本操作算法實現(要求采用類模板實現) [實現提示](同時可參見教材p5822-p60頁算法、ppt)函數、類名稱等可自定義,部分變量請加上學號后3位。庫函數載和常量定義:(代碼)#include (1)順序表存儲結構的定義(類的聲明):(代碼) template SeqList(datatype a[ ], int n);//有參構造函數 ~SeqList(){};//析構函數為空 int Length();//求線性表的長度 datatype Get(int i);//按位查找,取線性表的第i個元素 int Locate(datatype item);//查找元素item void Insert(int i, datatype item);//在第i個位置插入元素item datatype Delete(int i);//刪除線性表的第i個元素 void display();//遍歷線性表,按序號依次輸出各元素 private: datatype data[MaxSize];//存放數據元素的數組 int length;//線性表的長度 }; (2)初始化順序表算法實現(不帶參數的構造函數)/* *輸 入:無 *前置條件:順序表不存在 *功 能:構建一個順序表 *輸 出:無 *后置條件:表長為0 */ 實現代碼: template (3)順序表的建立算法(帶參數的構造函數) /* *輸 入:順序表信息的數組形式a[],順序表長度n *前置條件:順序表不存在 *功 能:將數組a[]中元素建為長度為n的順序表 *輸 出:無 *后置條件:構建一個順序表 */ 實現代碼: template cout<<“數組元素個數不合法”< data[i]=a[i];length=n;}(4)在順序表的第i個位置前插入元素e算法 /* *輸 入:插入元素e,插入位置i *前置條件:順序表存在,i要合法 *功 能:將元素e插入到順序表中位置i處 *輸 出:無 *后置條件:順序表插入新元素,表長加1 */ 實現代碼: template cout<<“溢出”< cout<<“i不合法!”< data[j]=data[j-1];data[i-1]=item;length++;}(5)刪除線性表中第i個元素算法 /* *輸 入:要刪除元素位置i *前置條件:順序表存在,i要合法 *功 能:刪除順序表中位置為i的元素 *輸 出:無 *后置條件: 順序表冊除了一個元素,表長減1 */ 實現代碼: template cout<<“表為空,無法刪除元素!”< cout<<“i不合法!”< for(j=i;j data[j-1]=data[j];//注意數組下標從0記 length--;return item;}(6)遍歷線性表元素算法 /* *輸 入:無 *前置條件:順序表存在 *功 能:順序表遍歷 *輸 出:輸出所有元素 *后置條件:無 */ 實現代碼: template cout<<“表為空,無法輸出!”< cout< (7)獲得線性表長度算法 /* *輸 入:無 *前置條件:順序表存在 *功 能:輸出順序表長度 *輸 出:順序表長度 *后置條件:無 */ 實現代碼: template (8)在順序線性表中查找e值,返回該元素的位序算法 /* *輸 入:查詢元素值e *前置條件:順序表存在 *功 能:按值查找值的元素并輸出位置 *輸 出:查詢元素的位置 *后置條件:無 */ 實現代碼: template //下標為i的元素等于item,返回其序號i+1 return 0;//查找失敗 } (9)獲得順序線性表第i個元素的值 /* *輸 入:查詢元素位置i *前置條件:順序表存在,i要合法 *功 能:按位查找位置為i的元素并輸出值 *輸 出:查詢元素的值 *后置條件:無 */ 實現代碼: template cout<<“i不合法!”< (10)判表空算法 /* *輸 入:無 *前置條件:無 *功 能:判表是否為空 *輸 出:為空返回1,不為空返回0 *后置條件:無 */ 實現代碼: template return 1;} else { return 0;} } (11)求直接前驅結點算法 /* *輸 入:要查找的元素e,待存放前驅結點值e1 *前置條件:無 *功 能:查找該元素的所在位置,獲得其前驅所在位置。*輸 出:返回其前驅結點的位序。*后置條件:e1值為前驅結點的值 */ 實現代碼: template return k;else { cout<<“無前驅結點!”< return 0;} }(12)求直接后繼結點算法 /* *輸 入:要查找的元素e,待存放后繼結點值e1 *前置條件:無 *功 能:查找該元素的所在位置,獲得其后繼所在位置。*輸 出:返回其后繼結點的位序。*后置條件:e1值為后繼結點的值 */ 實現代碼: template cout<<“無后繼結點!”< return k;} } 上機實現以上基本操作,寫出main()程序: void main(){ SeqList if(Seq.Empty()){ cout<<“線性表為空!”< } Seq.Insert(1,1);Seq.Insert(2,2);Seq.Insert(3,3);Seq.Insert(4,4);Seq.Insert(5,5);//插入元素操作 cout<<“輸出插入的五個元素:”< cout< cout<<“2是第”< cout<<“第五個元素是:”< cout<<“線性表的長度為:”< Seq.Delete(3);//刪除元素 cout<<“刪除第三個元素后的線性表為:”< cout< cout<<“元素2前驅結點的數值為:”< cout<<“元素4后繼結點的位置為:”< cout<<“元素4后繼結點的數值為:”< 要求對每個算法都加以測試,判斷是否正確;并測試不同類型數據的操作。粘貼測試數據及運行結果: 2、用以上基本操作算法,實現A=AUB算法。(利用函數模板實現)/* *輸 入:集合A,集合B *前置條件:無 *功 能:實現A=AUB *輸 出:無 *后置條件:A中添加了B中的元素。*/ 實現代碼: template return *this;else { int k=item.Length(); int num=this->Length(); for(int i=1;i<=k;i++) { for(int j=0;j if(data[j]==item.Get(i)) { break; } else if(num-1==j&&data[num-1]!=item.Get(i)) { this->Insert(++num,item.Get(i)); } } return *this;} } void main(){ SeqList B.Insert(1,2);B.Insert(2,6);B.Insert(3,1);B.Insert(4,8);B.Insert(5,9);//插入集合B中元素 A.Add(B);A.display();cout< 3、對以上順序表類中的基本操作算法適當加以補充,實現向一個有序的(非遞減)的順序表中插入數據元素e算法。/* *輸 入:插入元素e *前置條件:順序表已有序 *功 能:將元素e插入到順序表中適當的位置,使順序表依然有序 *輸 出: 無 *后置條件:有序順序表插入了新元素,且表長加1。*/ 實現代碼: template if((data[i] { for(int k=num;k>i;k--) data[k]=data[k-1]; data[i+1]=item; length++; break; } if(data[i]>item) { for(int k=num;k>i;k--) data[k]=data[k-1]; data[i]=item; length++; break; } } } void main(){ SeqList cout<<“原順序表為:”< cout< cout<<“插入新元素后的順序表為:”< 4、算法實現:La,Lb為非遞減的有序線性表,將其歸并為Lc,該線性表仍有序(未考慮相同時刪除一重復值)(利用函數類板實現)MergeList: /* *輸 入:有序線性表La,有序線性表Lb *前置條件:順序表已有序 *功 能:將兩線性表歸并,不去掉相同元素 *輸 出: 返回一個新的有序線性表Lc *后置條件:無 */ 實現代碼: template Seq1.orderInsert(Seq2.Get(i));} return Seq1;} void main(){ SeqList cout<<“合并后的Lc為:”< cout< 粘貼測試數據及運行結果: 三、心得體會:(含上機中所遇問題的解決辦法,所使用到的編程技巧、創新點及編程的心得) 實驗報告 課程名:數據結構 實驗名:線性表及其操作 姓名: 班級: 學號: 撰寫時間:2014.09.24 一 實驗目的與要求 1.掌握線性表的實現 2.掌握線性表的基本操作的實現 二 實驗內容 ? 分別完成線性表的順序表示及鏈式表示 ? 在兩種表示上, 分別實現一些線性表的操作, 至少應該包括 – 在第i個位置插入一個元素 – 刪除第i個元素 – 返回線性表長 – 返回第i個元素的值 三 實驗結果與分析 #include { printf(“%d, ”,(*p).value); p=(*p).next;//指針指向下一個結構體 } printf(“n”);} void Link(){ struct V*head;head=(struct V*)malloc(sizeof(struct V));//開辟一個長度為size的內存 (*head).value=-100;//表頭為-100(*head).next=NULL;printf(“------------線性表鏈式表示------------n”); int i,n=10;struct V*p=head;printf(“10個數據:n”);for(i=0;i (*p).next=(struct V*)malloc(sizeof(struct V)); p=(*p).next; (*p).value=2*i; (*p).next=NULL;} PrintLink(head);//調用PrintLink函數 printf(“刪除第四個數據:n”);int k=4;p=head;for(i=1;i p=(*p).next;} struct V*temp=(*p).next;//k表示插入和刪除的位置 (*p).next=(*temp).next;free(temp);PrintLink(head);printf(“插入第十個數據:n”); k=10;p=head;for(i=1;i p=(*p).next;} temp=(*p).next;(*p).next=(struct V*)malloc(sizeof(struct V));(*(*p).next).value=-99;(*(*p).next).next=temp;PrintLink(head);} //---------線性表順序表示-----------void seq1(){ int i,n=10,k=4;int a[10];//---------輸出數組元素------------printf(“-------------線性表順序表示---------n”);for(i=0;i a[i]=i;} printf(“數組元素為:n”);for(i=0;i printf(“%3d”,a[i]);} printf(“n”);//--------插入一個數組元素---------int m=n+1,j=12;//插入元素12 int b[20];for(i=0;i if(i { b[i]=a[i]; } else if(i==k) {b[i]=j;} else {b[i]=a[i-1];} } printf(“輸出插入一個元素的數組:n”);for(i=0;i { if(i {c[i]=a[i];} else {c[i]=a[i+1];} } printf(“輸出刪除一個元素的數組:n”);for(i=0;i printf(“數組元素為:n”);for(i=1;i<=a[0];i++){a[i]=i;} for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”);//-----在k位置插入一個元素------------for(i=a[0];i>=k;i--){a[i+1]=a[i];} a[k]=-100;++a[0];for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”);//-------在k---------------for(i=0;i>k;i++){a[i]=a[i+1];} a[k]=-1;a[0]=n;--a[0];for(i=0;i<2*a[0];i++){printf(“%d,”,a[i]);} printf(“n”); } int main(int argc,char *argv[]){ seq1();seq2();Link();return 0;} 圖1:實驗結果截圖 實驗分析:已在程序中按規定格式標注。 數據結構原理實驗報告 學號: 姓名: 線性表 一、問題描述 1.實現ADT表 2.設表的Reverse運算將表中元素的次序反轉。擴充用數組實現表的結構List,增加函數Reverse(L),將表L中元素的次序反轉,并要求就地實現Reverse運算。 二、算法描述 從i=0開始,將表中第N個元素與N-i-1個元素調換即可 三、核心代碼 void ReverseList(List L){ ListItem tmp;int i;for(i=0;i } tmp = L->table[i];L->table[i] = L->table[L->n-1-i];L->table[L->n-1-i] = tmp;} 四、運行結果第二篇:線性表的鏈式存儲結構實驗報告
第三篇:數據結構實驗報告二線性表的順序存儲
第四篇:數據結構線性表實驗報告
第五篇:福州大學數據結構實驗報告-線性表