狠狠干影院/欧美午夜电影在线观看/高黄文/国产精品一区二区在线观看完整版

數據結構實驗報告

| 瀏覽次數:

  本科實驗報告

 課程名稱:

  數據結構(C 語言版)

  實驗項目:

 線性表、樹、圖、查找、內排序

 實驗地點:

 明向校區實驗樓 208

  專業班級:

  學號:

 學生姓名:

 指導教師:

 楊永強

 2019 年

 1 月 10 日

  實驗名 稱

 實驗一

 線性表

 實驗目的和要求

 本次實習的主要目的是為了使學生熟練掌握線性表的基本操作在順序存儲結構和鏈式存儲結構上的實現,提高分析和解決問題的能力。要求仔細閱讀并理解下列例題,上機通過,并觀察其結果,然后獨立完成后面的實習題。

 實驗內容

 1.設順序表 A 中的數據元素遞增有序,試寫一程序,將 x 插入到順序表的適當位置上,使該表仍然有序。

 2.用單鏈表 ha 存儲多項式 A(x )=a 0 +a 1 x 1 +a 2 x 2 +…+a n x n (其中 a I 為非零系數),用單鏈表 hb 存儲多項式 B(x )=b 0 +b 1 x 1 +b 2 x 2 +…+b m x m (其中 b j 為非零系數),要求計算 C(x )= A(x )+B(x ),結果存到單鏈表 hc 中。試寫出程序。

 主要儀器設備

 臺式或筆記本電腦 實驗記錄( ( 寫出實驗內容中 (1)(2) 的運行結果和程序代碼 )( 可分欄或加頁) )

 1. #include <stdio.h>

 #include <stdlib.h> #include <string.h>

 #define OK 1 #define OVERFLOW -1

 typedef char ElemType;

  #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10

 typedef struct LNode{ //順序表節點結構

 ElemType *elem;//存儲空間基址

  int length;//當前長度

  int listsize;//當前分配的存儲容量

 }SqList;

 int InitList (SqList &L){//構造線性表

  L.elem=(ElemType *) malloc(LIST_INIT_SIZE*sizeof(ElemType));

 if(!L.elem) exit(OVERFLOW);

 printf ("輸入線性表:");

 gets(L.elem);

 L.length=strlen(L.elem);

 L.listsize=LIST_INIT_SIZE;

 return OK; }

 int ListInsert_Sq(SqList &L,ElemType x){//將元素 X 插入在適當位置

  if(L.length>=L.listsize){

  ElemType *newbase=(ElemType *)realloc(L.elem,

  (L.listsize+LISTINCREMENT)*sizeof(ElemType)) ;

  if(!newbase) exit(OVERFLOW);

  L.elem=newbase;

  L.listsize+=LISTINCREMENT;

 }

 int i=-1;//插入元素的位置

 for(int j=0;j<strlen(L.elem);j++){

  if(x<L.elem[j]) {

 i=j;break;

  }

 }

 if(i==-1) i=strlen(L.elem);

 //printf("i=%d\n",i);

 ElemType *q ;

 q=L.elem+i;//q 為插入位置

 for(ElemType *p=(L.elem+L.length-1);p>=q;--p){

  *(p+1)=*p;//插入位置及之后元素右移

  }

  *q=x;

 L.length++;

 return OK;

 }

 void PrintLinkList(SqList L){//輸出順序表

  for(int i=0;i<L.length;i++){

  printf("%c",L.elem[i]);

 }

 } int main(void){

 SqList L;

 InitList (L);

 //PrintLinkList(L);

 ElemType x;

 printf ("輸入插入元素:");

  scanf("%c",&x);

 ListInsert_Sq(L,x);

 printf ("線性表為:");

 PrintLinkList(L);

 return 0; }

 #include <stdio.h>

 #include <stdlib.h> #include <string.h> #define OK 1

 typedef struct{//項的表示,多項式的項作為 LinkList 的數據元素

  float coef;//系數

  int expn;//指數

 }term,ElemType;

  typedef struct LNode{ //單鏈表節點結構

 ElemType data;

 struct LNode *next; }LNode, *LinkList;

 typedef LinkList polynomial;

 int CreatLinkList(polynomial &P,int n){ //創建多項式

  P = (polynomial)malloc(sizeof(LNode));

 polynomial q=P;

 q->next=NULL;

 polynomial s;

 for(int i = 0; i < n; i++){

 s = (polynomial)malloc(sizeof(LNode));

  scanf("%f%d",&(s->data.coef),&(s->data.expn));

  q->next = s;

  s->next = NULL;

  q=q->next;

 }

 return OK; } 運行結果

 2. void PrintfPolyn(polynomial P){

 polynomial q;

 for(q=P->next;q;q=q->next){

  if(q->data.coef!=1)

 printf("%g",q->data.coef);

 if(q->data.expn)

 printf("%c%c%d","x","^",q->data.expn);

  else printf("%g",q->data.coef);

  if(q->next) printf(" + ");

 }

 printf("\n"); }

 void AddPolyn(polynomial &Pa,polynomial &Pb,polynomial &Pc) {

 polynomial qa,qb,qc;

 qa=Pa->next;

 qb=Pb->next;

 qc=Pc;

 //qa、qb、qc 分別指向 Pa、Pb、Pc 的當前結點

 while(qa&&qb){

  if((qa->data.expn)<(qb->data.expn)){

 qc->next=qa;qc=qa;

 qa=qa->next;

  }

  if((qa->data.expn)>(qb->data.expn)){

 qc->next=qb;qc=qb;

 qb=qb->next;

  }

  if((qa->data.expn)==(qb->data.expn)){

 qa->data.coef+=qb->data.coef;

 if(qa->data.coef!=0.0){

  qc->next=qa;qc=qa;qa=qa->next;

  polynomial b=qb;

  qb=qb->next;free(b);

 }

 else{//刪除 qa qb 當前指向節點 qa qb 后移

 polynomial da,db;

  da=qa;db=qb;

  qa=qa->next;

  qb=qb->next;

  free(da);free(db);

  if(!qa->next&&!qb->next)

  qc->next=NULL;

 }

  }

 }

 qc->next=qa?qa:qb;

 free(Pa);

  free(Pb); }

  int main(void){

 int a,b;

 polynomial Pa,Pb,Pc;

 printf("分別輸入多項式 A 和多項式 B 的元素個數:");

  scanf("%d%d",&a,&b);

 printf("輸入多項式 A:");

  CreatLinkList(Pa,a);

 printf("輸入多項式 B:");

  CreatLinkList(Pb,b);

 CreatLinkList(Pc,0);

 printf("A(x) = ");

  PrintfPolyn(Pa);

 printf("B(x) = ");

 PrintfPolyn(Pb);

 AddPolyn(Pa,Pb,Pc);

 printf("C(x) = ");

 PrintfPolyn(Pc);

 return 0; } 運行結果

  遇到的問題和解決方法

 對線性表的基本操作不熟悉,查找課本,多次運用,加深理解,以便能夠將各種操作及其應用運用到程序中。

 心得體會

 不能只看課本,要自己動手寫程序,在實踐中加深理解。

 實驗名稱

 實驗二

 樹

 實驗目的和要求

 熟悉樹的各種表示方法和各種遍歷方式,掌握有關算法的實現,了解樹在計算機科學及其它工程技術中的應用。

 實驗內容

 編寫遞歸算法,計算二叉樹中葉子結點的數目。

 主要儀器設備

 臺式或筆記本電腦 實驗記錄( ( 寫出實驗內容中 (1)(2) 的運行結果和程序代碼 )( 可分欄或加頁) )

 #include <stdio.h> #include <stdlib.h>

 #define OK 1 #define OVERFLOW -1

 typedef char TElemType;

 typedef struct BiTNode { //結點結構

 TElemType data;

 struct BiTNode

 *lchild, *rchild; //左右孩子指針 }BiTNode, *BiTree;

  //按先序序列建立二叉樹 int CreateBiTree(BiTree &T){

 TElemType ch;

 scanf("%c", &ch);

 if (ch==".") T = NULL;

 else {

  if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);

  T->data = ch;

 // 生成根結點

  CreateBiTree(T->lchild);

  // 構造左子樹

  CreateBiTree(T->rchild);

  // 構造右子樹

 }

 return OK;

  }//CreateBiTree

  int Leaf(BiTree T) {

 if(T==NULL)

 return 0;

 if(!T->lchild && !T->rchild)

  return 1;

 return Leaf(T->lchild)+Leaf(T->rchild);

 } int main(){

  BiTree T; //declaration

 printf("\n 輸入樹: \n");

 //用例:ABD..EH...CF.I..G..\n

 CreateBiTree(T); //創建

  printf("\n 葉子結點樹為 : ");

 int n=Leaf(T);

 printf("%d\n",n);

 return 0; } 運行結果

 遇到的問題和解決方法

 對遞歸理解不夠到位,寫關于遞歸的算法有困難。通過查找資料,請教同學解決問題。

 心得體會

 要培養自己的動手實踐能力。

 實驗名稱

 實驗三

 圖

 實驗目的和要求

 熟悉圖的存儲結構,掌握有關算法的實現,了解圖在計算機科學及其他工程技術中的應用。

 實驗內容

 試基于圖的深度優先搜索策略編寫一程序,判別以鄰接表方式存儲的有向圖中是否存在有頂點V i 到 V j 頂點的路徑(i≠j)。

 主要儀器設備

 臺式或筆記本電腦 實驗記錄( ( 寫出實驗內容中 (1)(2) 的運行結果和程序代碼 )( 可分欄或加頁) )

 #include <stdio.h> #include <stdlib.h>

 #define MAX_VERTEX_NUM 30

 typedef struct ArcNode{

 int adjvex;

 struct ArcNode *nextarc; }ArcNode;

 typedef struct VNode{

 int data;

 ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM];

 typedef struct{

 AdjList vertices;

 int vexnum,arcnum; }ALGraph;

 creat_DG_ALGraph(ALGraph *G){

 int i,j,k;ArcNode *p;

 p=NULL;

 printf("分別輸入結點數、邊數:");

 scanf("%d%d",&G->vexnum,&G->arcnum);

 printf("輸入結點:\n");

 for(i=0;i<G->vexnum;i++)

 {

  scanf("%d",&G->vertices[i].data);

  G->vertices[i].firstarc=NULL;

 }

 /*for(i=0;i<G->vexnum;i++)

 printf("%d ",G->vertices[i].data);

  printf("\n");*/

 for(k=0;k<G->arcnum;k++){

  p=(ArcNode*)malloc(sizeof(ArcNode));

  printf("輸入邊 <i,j>: ");

  scanf("%d,%d", &i, &j);

  printf("\n");

  p->adjvex = j;

  p->nextarc=G->vertices[i].firstarc;

  G->vertices[i].firstarc=p;

 }

 }

 int exist_path_DFS(ALGraph G,int i,int j){

  ArcNode *p;

  int k,visited[MAX_VERTEX_NUM];

  p=NULL;

  if(i==j) return 1;

  else {visited[i]=1;

  for(p=G.vertices[i].firstarc;p;p=p->nextarc)

 {k=p->adjvex;

  if(!visited[k]&&exist_path_DFS(G,k,j));

 }

  } }

 int main(void){

 ALGraph *G;

  int i,j;

  G=NULL;

  creat_DG_ALGraph(G);

  printf("輸入要查找的路徑(從 i 到 j):\n");

  scanf("%d%d",&i,&j);

  if(exist_path_DFS(*G,i,j)) printf("Exist the path!");

  else printf("Not exist the path");

  return 0; } 遇到的問題和解決方法

 不熟悉圖的存儲結構和有關算法的實現。

 心得體會

 要多看課本掌握基本知識。

 實驗名稱

 實驗四

 查找

 實驗目的和要求

 通過本次實驗,掌握查找表上的有關查找方法,并分析時間復雜度。

 實驗內容

 1. 編寫程序實現下面運算:在二叉排序樹中查找關鍵字為 key 的記錄。

 2. 試將折半查找的算法改寫成遞歸算法。

 主要儀器設備

 臺式或筆記本電腦 實驗記錄( ( 寫出實驗內容中 (1)(2) 的運行結果和程序代 碼 )( 可分欄或加頁) )

 1. #include<stdio.h>

  #include<stdlib.h>

 #define FALSE 0 #define TURE 1

 typedef struct BiTNode

  {

 int key;

  struct BiTNode *lchild, *rchild;

  } BiTNode, *BiTree;

 int SearchBST(BiTree T,int key,BiTree f,BiTree &p )//查找

 {

 if(!T)

 {p=f;return FALSE;}

 else if (key==T->key) {p=T;return TURE;}

  else if(key<T->key) SearchBST(T->lchild,key,T,p);

 else SearchBST(T->rchild,key,T,p);

 }

 int InsertBST(BiTree &T,int key)//插入

 {

 if(!T)

  {

  T=(BiTree)malloc(sizeof(BiTNode));

 T->key=key;

  T->lchild=(T)->rchild=NULL;

  }

  if(key==T->key) return FALSE;

  if(key>T->key) InsertBST(T->rchild,key);

 else InsertBST(T->lchild,key);

 }

 int main(void)

  {

  int e,n;

  BiTree T=NULL,f,p;

 printf("輸入長度:");

 scanf("%d",&n);

  printf("輸入關鍵字:");

  while(n--)

  {

 scanf("%d",&e);

  InsertBST(T, e);

  }

  printf("輸入要查找元素:");

 scanf("%d",&e);

  if(SearchBST(T,e,f,p)) printf("查找成功\n");

 else printf("查找失敗\n");

 return 0;

 } 運行結果

  2. #include <stdio.h> #include <stdlib.h>

  #define OK 1 #define OVERFLOW -1

 #define LIST_INIT_SIZE 100

 //順序表初始分配量 #define LISTINCREMENT 10

 //分配增量

 typedef int KeyType;

 typedef struct{//元素結構

 KeyType key; //主鍵

 //…

  //其他 }SElemType;

  typedef struct{//順序查找表結構

 SElemType *elem;

 int listsize;

 int length; }SSTable;

 int PrintSqList(SSTable &ST){//輸出順序表

 printf("Sequenlial List.\nPos\tKey\n");

 for(int i = 1; i <= ST.length; i++)

  printf("%5d\t%5d\n", i, ST.elem[i]);

 return OK; }//PrintSSTable

 int InitSSTable(SSTable &ST, SElemType value[], int n){ //初始化順序表

 ST.elem = (SElemType *)malloc(LIST_INIT_SIZE * sizeof(SElemType));

 if(!ST.elem) exit(OVERFLOW);

 ST.listsize = LIST_INIT_SIZE;

 ST.length = n;

 SElemType *p = &ST.elem[1]; //elem[0]作為"哨兵"

 for(int i = 0; i < n; i++) *p++ = value[i];

 return OK; }//InitSSTable

 //折半查找 int Search_Bin ( SSTable ST, KeyType key, int low, int high ){

 if(low<=high){

  int mid=(low+high)/2;

 if(ST.elem[mid].key==key) return mid;

 if(ST.elem[mid].key>key) return Search_Bin(ST,key,low,mid-1);

 if(ST.elem[mid].key<key) return Search_Bin(ST,key,mid+1,high);

 }

 else return 0; }

 int main(void){

 SSTable ST; //聲明

  SElemType value[] = {12,23,28,35,37,39,50,60,78,90};//用例

  InitSSTable(ST, value, (sizeof(value))/(sizeof(SElemType))); //初始化

 PrintSqList(ST); //輸出

  KeyType key = 23; //關鍵字

 printf("key=%d \t pos=%d\n", key, Search_Bin(ST, key,1,(sizeof(value))/(sizeof(SElemType)))); //折半查找

 key = 58;

 printf("key=%d \t pos=%d\n", key, Search_Bin(ST, key,1,(sizeof(value))/(sizeof(SElemType)))); //折半查找

 }

 運行結果

 遇到的問題和解決方法

 不熟悉樹的存儲結構和有關算法的實現。

 心得體會

 要多看課本掌握基本知識。

 實驗名稱

 實驗五

 內部排序

 實驗目的和要求

 通過本次實驗,掌握線性表的排序方法,并分析時間復雜度。

 實驗內容

 設計一個用鏈表表示的直接選擇排序算法,并用程序實現。

 算法說明:已知待排序初始序列用單鏈表存貯,頭指針 head 指向第一個結點,從這個待排序列中找出最小結點,插入 head 之后,用 r 來指示。r 以前為已排序序列,r 以后為未排序序列。再從未排序序列中找出最小結點插入 r 的后面,讓 r 指向這個結點。反復執行這個過程,直到排好序。

 主要儀器設備

 臺式或筆記本電腦 實驗記錄( ( 寫出實驗內容中 (1)(2) 的運行結果和程序代碼 )( 可分欄或加頁) )

 #include <stdio.h>

 #include <stdlib.h> #include <string.h>

 #define OK 1

 typedef int ElemType; typedef struct LNode{ //單鏈表節點結構

 ElemType

 data;

 struct LNode

 *next; }LNode, *LinkList;

 int CreatLinkList(LinkList &L, int n){ //創建帶頭單鏈表

 L = (LinkList)malloc(sizeof(LNode));

 ElemType e;

 L->next = NULL;

 LinkList p;

 for(int i = 0; i < n; i++){

  scanf("%d",&e);

  p = (LinkList)malloc(sizeof(LNode));

  p->data = e;

  p->next = L->next;

  L->next = p;

 }

 return OK; }//CreatLinkList

 void PrintList (LinkList L){//輸出單鏈表

  LinkList p;

  for(p=L->next; p; p=p->next)

  printf("%d ",p->data); }//PrintList void SelectMinKey(LinkList L,LinkList &q){//選擇最小關鍵字

  LinkList p;

 q=(LinkList)malloc(sizeof(LNode));

 q->data=10000;

 for(p=L->next; p; p=p->next){

  if((p->data)<(q->data)) q=p;

 } }//SelectMinKey

 void SlectSort (LinkList &L){//選擇排序

  LinkList head,r,p,q;

 head=L->next;

 r=L;

 p=(LinkList)malloc(sizeof(LNode));

  for(int i=1;r->next->next;i++){

  SelectMinKey(r,q);

  //printf("%d ",q->data);

  p->data=q->data;

  q->data=r->next->data;

  r->next->data=p->data;

  r=r->next;

  printf("第%d 次排序:",i);

  PrintList(L);

  printf("\n");

  } }//SlectSort

 int main(void){

 LinkList L,q;

 int n;

 printf("輸入鏈表長度:");

 scanf("%d",&n);

 printf("輸入鏈表:");

 CreatLinkList(L,n);

 /*PrintList(L);

  printf("\n");*/

 SlectSort(L);

 printf("排序后鏈表:");

 PrintList(L);

 return 0; } 運行結果

 遇到的問題和解決方法

 對插入過程和算法不熟悉,程序的細節方面處理不到位。

 心得體會

 要多看課本,理解知識,多動手寫程序。

推薦訪問: 數據結構 實驗 報告

【數據結構實驗報告】相關推薦

工作總結最新推薦

NEW
  • 同志們:今天這個大會,是市委全面落實黨要管黨、從嚴治黨要求的一項重大舉措,也是對縣市區委書記履行基層黨建工作第一責任人情況的一次集中檢閱,同時是對全市基層黨建工作的一次再部署、再落實的會議。前面,**

  • ***年,我認真履行領班子、帶隊伍、抓黨員、保穩定的基層黨建工作思路,以學習貫徹習近平新時代中國特色社會主義思想和黨的十九大歷次全會精神為主線,以市局基層黨建工作考核細則為落腳點,落實全面從嚴治黨主體

  • 根據會議安排,現將2022年履行抓基層黨建工作職責情況報告如下:一、履職工作特色和亮點1 突出政治建設,著力在思想認識上提高。牢固樹立抓黨建就是抓政績的理念,以“黨建工作抓引領、社區治理求突破,為民服

  • 2022年以來,在**黨委的正確領導下,堅持以習近平新時代中國特色社會主義思想為指導,深入學習宣傳貫徹黨的二十大精神,以黨建工作為統領,扎實開展夯實“三個基本”活動,以“四化四力”行動為抓手,聚力創建

  • 各位領導,同志們:根據會議安排,現就2022年度抓基層黨建工作情況匯報如下:一、主要做法及成效(一)強化政治引領。一是不斷強化理論武裝。堅持通過黨組會、中心組學習會和“三會一課”,第一時間、第一議題學

  • 2022年度抓基層黨建工作述職報告按照黨委工作部署,現將本人2022年度抓基層黨建工作情況報告如下:一、2022年度抓基層黨建工作情況(一)旗幟鮮明講政治將旗幟鮮明講政治放在全局發展首要位置,積極開展

  • 2022年,是我在數計系黨總支書記這個新崗位上度過的第一個完整的工作年度。回首一年來在校黨委的正確領導下,與數計系領導班子和全體師生共同走過的日子,艱辛歷歷在目,收獲溫潤心田。作為黨總支書記,我始終牢

  • 按照考核要求,現將本人一年來,作為統戰部長履行職責、廉潔自律等方面情況報告如下:一、著眼增強政治素質,不斷深化理論學習堅持把旗幟鮮明講政治作為履職從政的第一位要求,帶領統戰系統干部堅決擁護“兩個確立”

  • **年,緊緊圍繞黨工委、管委會的決策部署,全體人員團結協作、凝心聚力,緊扣黨工委“**”基本工作思路,全力開拓進取,認真履職盡責,圓滿完成各項工作任務。一、個人思想政治狀況檸檬文苑www bgzjy

  • 按照縣委關于開展抓基層黨建述職評議會議的有關要求,經請示縣委組織部同意,今天,我們在此召開2022年度基層黨組織書記抓基層黨建述職評議會議。1 首先,請**黨委書記,**同志述職。**黨委能夠主動研究