第一篇:數據結構--實驗報告 線性表的基本操作
}(一)單鏈表的基本操作
#include
LinkList q=L;//使q指向表尾
} Status GetElem(LinkList L,int i,ElemType &e)//取第i個元素 { LinkList p=L->next;int j=1;while(p&&jnext;++j;} for(int i=1;i<=n;i++){ p=new LNode;
cin>>p->data;p->next=NULL;q->next=p;q=p;} if(!p||j>i)return error;//第i個元素不存在
e=p->data;return ok;} Status LinkInsert(LinkList &L,int i,ElemType e)//插入 { LinkList p=L;int j=0;while(p&&j
s->data=e;s->next=p->next;//插入L中
p->next=s;return ok;}
Status ListDelete(LinkList &L,int i,ElemType &e)// 刪除 { LinkList p=L;LinkList q;int j=0;while(p->next&&j p=p->next;++j;} if(!(p->next)||j>i-1)return error;//刪除位置不合理 q=p->next;p->next=q->next;//刪除并釋放結點 e=q->data;delete(q);return ok; } void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){ //合并兩個順序鏈表 LinkList pa,pc,pb;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;delete(Lb);} void show(LinkList L)//{ LinkList p;p=L->next;while(p){ cout< data<<“-->”;p=p->next;} cout< 顯示 表長 3 p=p->next;} return i;} void xiugai(LinkList L)//修改 { int i,j=1;ElemType k;ElemType e,m;LinkList p=L->next;cout<<“請輸入要修改的元素位置(0>i;GetElem(L,i,e);cout<<“該位置的元素:”< cin>>x; cout<<“請輸入”< CreateList(list,x);break;case 2: cout<<“單鏈表顯示如下:”< show(list);break;case 3: int s;cout<<“單鏈表的長度為:”< ListDelete(list,x,y); } break;case 8: hebing();break;case 9: exit(0);break;default : cout<<“輸入有誤,請重新輸入”< 四、測試結果 1)順序表 的測試結果 8 2)單鏈表的測試結果 五、心得體會 當聽到老師說寫數據結構實驗報告時,我有點驚訝,才學了不到一個月,就要寫實驗報告。記得去年學習C++時,學了一個學期,程序設計用了三周,才完成的,這個實驗報告居然要一周完成兩個設計,覺得很難。但是現在一周過去了,我也寫完了,自我感覺良好。 通過這次寫實驗報告,我深切的理解了這門課的本質。剛開始學這門課時,當時還不清楚這門課程的目的,現在,我真正的理解了:數據結構像是身體的骨骼,而C++是填充這骨骼的肉體,二者相結合才能使整個程序更加完整,健全。數據結構是個框架,模型,抽象數據類型中列舉了各種操作,而所用的C++語言,將各種操作描述出來構成算法。數據結構+算法=程序設計。 在這次設計的過程中,我還遇到了,很多的問題。順序表是按順序存儲的,用了一維數組來存儲,又結合C++的程序設計,我又用了類,但是,在執行時出現了問題。后來問同學,指出我的錯誤,不過獲益不少。我又重新整理思路,把順序表的基本操作寫好了。雖然走了很多彎路,但是讓我認識到,一定要創新,大膽,不能按照舊的思路去干新的事情。 單鏈表寫起來簡單多了,這個很快就搞定了。但是細節上出了問題。比如說,有些變量的重復定義,有些變量又沒有定義,在調用函數,就直接復制過來,沒有改參數……通過修改,我深刻理解到:細節決定成敗,在以后,不管做任何事情都要認真,細心。 這次的實驗報告,讓我受益匪淺,不僅有知識方面的,還有生活和精神上的。總之,我會繼續我的興趣編程,相信在編程的過程中,能不斷的提高自己。 實驗報告 課程名:數據結構 實驗名:線性表及其操作 姓名: 班級: 學號: 撰寫時間: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;} 四、運行結果 實驗 一 線性表的基本操作實現及其應用 一、實驗目的 1、熟練掌握線性表的基本操作在兩種存儲結構上的實現,其中以熟悉各種鏈表的操作為重點。 2、鞏固高級語言程序設計方法與技術,會用線性鏈表解決簡單的實際問題。 二、實驗內容 √ 1、單鏈表的表示與操作實現(*) 2、約瑟夫環問題 3、Dr.Kong的藝術品 三、實驗要求 1、按照數據結構實驗任務書,提前做好實驗預習與準備工作。 2、加“*”題目必做,其他題目任選;多選者并且保質保量完成適當加分。 3、嚴格按照數據結構實驗報告模板和規范,及時完成實驗報告。 四、實驗步驟 (說明:依據實驗內容分別說明實驗程序中用到的數據類型的定義、主程序的流程以及每個操作(成員函數)的偽碼算法、函數實現、程序編碼、調試與分析、總結、附流程圖與主要代碼) ㈠、數據結構與核心算法的設計描述 (程序中每個模塊或函數應加注釋,說明函數功能、入口及出口參數) 1、單鏈表的結點類型定義 /* 定義DataType為int類型 */ typedef int DataType; /* 單鏈表的結點類型 */ typedef struct LNode { DataType data;struct LNode *next;}LNode,*LinkedList; 2、初始化單鏈表 LinkedList LinkedListInit(){ // 每個模塊或函數應加注釋,說明函數功能、入口及出口參數 } 3、清空單鏈表 void LinkedListClear(LinkedList L){// 每個模塊或函數應加注釋,說明函數功能、入口及出口參數} 4、檢查單鏈表是否為空 int LinkedListEmpty(LinkedList L){ ….} 5、遍歷單鏈表 void LinkedListTraverse(LinkedList L){ ….} 6、求單鏈表的長度 int LinkedListLength(LinkedList L){ ….} 7、從單鏈表表中查找元素 LinkedList LinkedListGet(LinkedList L,int i){ //L是帶頭結點的鏈表的頭指針,返回第 i 個元素 } 8、從單鏈表表中查找與給定元素值相同的元素在鏈表中的位置 LinkedList LinkedListLocate(LinkedList L, DataType x){ …… } 9、向單鏈表中插入元素 void LinkedListInsert(LinkedList L,int i,DataType x){ // L 為帶頭結點的單鏈表的頭指針,本算法 // 在鏈表中第i 個結點之前插入新的元素 x } 10、從單鏈表中刪除元素 void LinkedListDel(LinkedList L,DataType x){ // 刪除以 L 為頭指針的單鏈表中第 i 個結點 } 11、用尾插法建立單鏈表 LinkedList LinkedListCreat(){ …… } ㈡、函數調用及主函數設計 (可用函數的調用關系圖說明)㈢ 程序調試及運行結果分析 ㈣ 實驗總結 五、主要算法流程圖及程序清單 1、主要算法流程圖: 2、程序清單 (程序過長,可附主要部分) 說明:以后每次實驗報告均按此格式書寫。 我在布置實驗室時,僅給出實驗名稱、實驗目的、實驗內容及相關數據結構。 題目一程序參考框架 # include /* 單鏈表的結點類型 */ typedef struct LNode {ElemType data;struct LNode *next;} LNode,*LinkedList; /* 初始化單鏈表 */ LinkedList LinkedListInit(){ } /* 清空單鏈表 */ void LinkedListClear(LinkedList L){ } /* 檢查單鏈表是否為空 */ int LinkedListEmpty(LinkedList L){ } /* 遍歷單鏈表 */ void LinkedListTraverse(LinkedList L){ } int LinkedListLength(LinkedList L){ } LinkedList LinkedListGet(LinkedList L, int i){ } LinkedList LinkedListLocate(LinkedList L, ElemType x){ } void LinkedListInsert(LinkedList L, int i, ElemType x){LinkedList pre,p,s;int j;pre=L;j=1;p=L->next;while(pre&&jnext;j++;} if(pre==NULL){printf(“給的i值超過了表長”);exit(0);} s=(LNode *)malloc(sizeof(LNode));s->data=x;pre->next=s;s->next=p;} void LinkedListDel(LinkedList L,ElemType x){ LinkedList pre,p;int j;pre=L;j=1;p=L->next;while(p&&p->data!=x){pre=p;p=p->next;j++;} if(p==NULL){printf(“表中沒有值為x的結點”);exit(0);} pre->next=p->next;free(p);} LinkedList LinkedListCreat(){ LinkedList L=LinkedListInit(),p,r;ElemType x;r=L;printf(“please input data,input-1 is endn”);scanf(“%d”,&x);while(x!=flag){p=(LinkedList)malloc(sizeof(LNode));p->data=x;r->next=p;r=p;scanf(“%d”,&x);} r->next=NULL;return L;} int scan(){int d;printf(“please input the operationn”);printf(“1.初始化 2.清空3.求鏈表長度4.檢查鏈表是否為空n”);printf(“5.檢查鏈表是否為滿 6.遍歷鏈表 7.從鏈表中查找元素n”);printf(“8.從鏈表中查找與給定元素值相同的元素在順序表中的位置n”);printf(“9.向鏈表中插入元素10.從鏈表中刪除元素n”);printf(“其他鍵退出。。。n”);scanf(“%d”,&d);return(d);} main(){int quit=0;int i;ElemType e;LinkedList L;while(!quit)switch(scan()){case 1: ….;break;case 2: ….;break;case 3: ….;break;case 4: ….;break;case 5:LinkedListTraverse(L);break;case 6: ….;break;case 7: ….;break;case 8: ….;break;case 9: ….;break;case 10: ….;break;default: quit=1;} return 0;} 線性表上機實習 1、實驗目的 (1)熟悉將算法轉換為程序代碼的過程。 (2)了解順序表的邏輯結構特性,熟練掌握順序表存儲結構的C語言描述方法。 (3)熟練掌握順序表的基本運算:查找、插入、刪除等,掌握順序表的隨機存取特性。(4)了解線性表的鏈式存儲結構,熟練掌握線性表的鏈式存儲結構的C語言描述方法。(5)熟練掌握線性鏈表(單鏈表)的基本運算:查找、插入、刪除等,能在實際應用中靈活選擇適當的鏈表結構。 2、實驗要求 (1)熟悉順序表的插入、刪除和查找。(2)熟悉單鏈表的插入、刪除和查找。 3、實驗內容: ① 順序表 (1)抽象數據類型定義 typedef struct { TypeData data[maxsize]; //容量為maxsize的靜態順手表 int n; //順序表中的實際元素個數 }SeqList; //靜態順序表的定義 在本次實驗中,首先建立一個空的靜態順序表,然后鍵盤輸入數據存入表中,然后進入菜單選擇界面,通過不同的數字輸入,實現對順序表,刪除,插入,查找,顯示等操作。 (2)存儲結構定義及算法思想 在順序表結構體的定義中,typedef int TypeData 為整型,存儲結構如下: for(n=0;n cout<<“請輸入線性表數據”< cin>>L.data[n]; //順序將數據存入順序表 } //其他存儲與此類似,都是直接賦值與數組的某一位 插入版塊子函數: void insert(SeqList &L) //插入數據 { int a,b,c,k; cout<<“請輸入插入的數及其插入的位置”< cin>>a>>b; if(b<=0||b>(L.n+1)){cout<<“不能在該位置插入”< k=L.data[b-1];L.data[b-1]=a;c=L.n;L.n=L.n+1; while(c>b){ L.data[c]=L.data[c-1];c--; //通過循環,實現插入位置后的數據挨個往后移動一位 } L.data[b]=k;} 順序表的插入與刪除操作類似,在插入與刪除后,都要循環調整后面數組的每一位元素,同時記錄數據元素的長度的標示符也要跟著改變。顯示操作是通過循環實現表中第一個元素到最后一個元素的輸出,查找操作是直接取數組中的查找位輸出。 (3)實驗結果與分析 ② 單鏈表 (1)抽象數據類型定義 typedef struct node{ DataType data; //鏈表的數據類型 struct node *link; //鏈表的結點指針 }linknode,*linklist; //定義了結構體linklode和結構體指針linklist 在本次實驗中,首先程序自己建立一個空的頭結點,通過菜單的功能選擇“添加鏈表數據”可自由添加鏈表的節點數及元素值。在菜單選擇中,有“添加鏈數據”,“插入鏈表數據”,“刪除鏈表數據”,“查找鏈表數據”和“顯示鏈表數據”功能,選擇不能的功能選擇就能實現不同的操作。其中“添加鏈表數據”可反復批量輸入鏈表數據。 (2)存儲結構定義及算法思想 在單鏈表中,typedef int DataType;DataType data;定義鏈表存儲數據位整型。存儲結構如下: while(p->link!=NULL){ p=p->link; k++; //首先找到單鏈表的最后結點(如果是只有頭結點 } 的單鏈表則直接跳過),以便后面接著輸入數據第二篇:數據結構線性表實驗報告
第三篇:福州大學數據結構實驗報告-線性表
第四篇:《數據結構》 實驗報告(附實例) ---實驗一 線性表的基本操作實現
第五篇:數據結構線性表試驗報告