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