欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      數(shù)據(jù)結構(C語言版)實驗報告格式5則范文

      時間:2019-05-14 19:06:20下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關的《數(shù)據(jù)結構(C語言版)實驗報告格式》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《數(shù)據(jù)結構(C語言版)實驗報告格式》。

      第一篇:數(shù)據(jù)結構(C語言版)實驗報告格式

      姓名:學號:實驗日期:

      實驗<實驗序號>

      <題號>、<題目內(nèi)容>

      算法思路:<算法的主要實現(xiàn)方法和主要數(shù)據(jù)結構的實現(xiàn)方法>

      算法描述:<算法描述內(nèi)容>

      算法分析:<算法的時間復雜度>(要說明基本操作是什么)

      數(shù)據(jù)分析:<輸入數(shù)據(jù)>+<輸出數(shù)據(jù)>

      ……

      第二篇:c數(shù)據(jù)結構實驗報告

      c數(shù)據(jù)結構實驗報告

      數(shù)據(jù)結構(C語言版)實驗報告;專業(yè):計算機科學與技術、軟件工程;學號:____XX40703061_____;班級:_________軟件二班________;姓名:________朱海霞__________;指導教師:___劉遵仁_____________;青島大學信息工程學院;XX年10月;實驗1;實驗題目:順序存儲結構線性表的插入和刪除;實驗目

      數(shù)據(jù)結構(C語言版)實驗報告

      專業(yè):計算機科學與技術、軟件工程

      學號:____XX40703061___________________

      班級:_________軟件二班______________

      姓名:________朱海霞______________

      指導教師:___劉遵仁________________

      青島大學信息工程學院

      XX年10月

      實驗1

      實驗題目:順序存儲結構線性表的插入和刪除

      實驗目的:

      了解和掌握線性表的邏輯結構和順序存儲結構,掌握線性表的基本算法及相關的時間性能分析。

      實驗要求:

      建立一個數(shù)據(jù)域定義為整數(shù)類型的線性表,在表中允許有重復的數(shù)據(jù);根據(jù)輸入的數(shù)據(jù),先找到相應的存儲單元,后刪除之。

      實驗主要步驟:

      1、分析、理解給出的示例程序。

      2、調(diào)試程序,并設計輸入一組數(shù)據(jù)(3,-5,6,8,2,-5,4,7,-9),測試程序的如下功能:根據(jù)輸入的數(shù)據(jù),找到相應的存儲單元并刪除,顯示表中所有的數(shù)據(jù)。

      程序代碼:

      #include

      #include

      #define OK 1

      #define ERROR 0

      #define OVERFLOW-2

      #define LIST_INIT_SIZE 100

      #define LISTINCREMENT 10

      typedef struct{

      int* elem;

      int length;

      int listsize;

      }Sqlist;

      int InitList_Sq(Sqlist &L){

      =(int*)malloc(LIST_INIT_SIZE*sizeof(int));

      if(!)return-1;

      =0;

      =LIST_INIT_SIZE;

      return OK;

      }

      int ListInsert_Sq(Sqlist&L,int i,int e){

      if(i+1)return ERROR;

      if(==){

      int *newbase;

      newbase=(int*)realloc(,(+LISTINCREMENT)*sizeof(int));

      if(!newbase)return-1;

      =newbase;

      +=LISTINCREMENT;

      }

      int *p,*q;

      q=&();

      for(p=&();p>=q;--p)

      *(p+1)=*p;

      *q=e;

      ++;

      return OK;

      }

      int ListDelete_Sq(Sqlist &L,int i,int e){

      int *p,*q;

      if(i)return ERROR;

      p=&();

      e=*p;

      q=+;

      for(++p;p *(p-1)=*p;

      --;

      return OK;

      }

      int main(){

      Sqlist L;

      InitList_Sq(L);//初始化

      int i,a={3,-5,6,8,2,-5,4,7,-9};

      for(i=1;i ListInsert_Sq(L,i,a);

      for(i=0;i printf(“ %d”,);

      printf(“ ”);//插入9個數(shù)

      ListInsert_Sq(L,3,24);

      for(i=0;i printf(“ %d”,);

      printf(“ ”);//插入一個數(shù)

      int e;

      ListDelete_Sq(L,2, e);

      for(i=0;i printf(“ %d”,);//刪除一個數(shù)

      printf(“ ”);

      return 0;

      }

      實驗結果:

      3,-5,6,8,2,-5,4,7,-9

      3,-5,24,6,8,2,-5,4,7,-9

      3,24,6,8,2,-5,4,7,-9

      心得體會:

      順序存儲結構是一種隨機存取結構,存取任何元素的時間是一個常數(shù),速度快;結構簡單,邏輯上相鄰的元素在物理上也相鄰;不使用指針,節(jié)省存儲空間;但是插入和刪除元素需要移動大量元素,消耗大量時間;需要一個連續(xù)的存儲空間;插入元素可能發(fā)生溢出;自由區(qū)中的存儲空間不能被其他數(shù)據(jù)共享 實驗2

      實驗題目:單鏈表的插入和刪除

      實驗目的:

      了解和掌握線性表的邏輯結構和鏈式存儲結構,掌握單鏈表的基本算法及相關的時間性能分析。

      實驗要求:

      建立一個數(shù)據(jù)域定義為字符類型的單鏈表,在鏈表中不允許有重復的字符;根據(jù)輸入的字符,先找到相應的結點,后刪除之。

      實驗主要步驟:

      3、分析、理解給出的示例程序。

      4、調(diào)試程序,并設計輸入數(shù)據(jù)(如:A,C,E,F(xiàn),H,J,Q,M),測試程序的如下功能:不允許重復字符的插入;根據(jù)輸入的字符,找到相應的結點并刪除。

      5、修改程序:

      (1)增加插入結點的功能。

      (2)建立鏈表的方法有“前插”、“后插”法。

      程序代碼:

      #include

      #include

      #define NULL 0

      #define OK 1

      #define ERROR 0

      typedef struct LNode{

      int data;

      struct LNode *next;

      }LNode,*LinkList;

      int InitList_L(LinkList &L){

      L=(LinkList)malloc(sizeof(LNode));L->next=NULL;

      return OK;

      } int ListInsert_L(LinkList &L,int i,int e){ LinkList p,s;

      int j;

      p=L;j=0;

      while(p&&j

      p=p->next;++j;

      }

      if(!p||j>i-1)

      return ERROR;

      s=(LinkList)malloc(sizeof(LNode));s->data=e;

      s->next=p->next;

      p->next=s;

      return OK;

      } int

      ListDelete_L(LinkList&L,int

      i,int &e){ LinkList p,q;

      int j;

      p=L;j=0;

      while(p->next&&j

      p=p->next;++j;

      }

      if(!(p->next)||j

      return ERROR;

      q=p->next;p->next=q->next;e=q->data;free(q);

      return OK;

      }

      int main(){

      LinkList L,p;

      char a={'A','C','E','F','H','J','Q','U'};int i,j;

      InitList_L(L);

      for(i=1,j=0;i p=L->next;

      while(p!=NULL){

      printf(“%c ”,p->data);p=p->next;}//插入八個字符

      printf(“;實驗結果:;ACEFHJQU;ABCEFHJQU;ABEFHJQU;心得體會:;單鏈表是通過掃描指針P進行單鏈表的操作;頭指針唯;實驗3;實驗題目:棧操作設計和實現(xiàn);實驗目的:;

      1、掌握棧的順序存儲結構和鏈式存儲結構,以便在實;

      2、掌握棧的特點,即后進先出和先進先出的原則;

      3、掌握棧的基本運算,如:入棧與出棧

      }

      }//插入八個字符 printf(” “);i=2;int e;ListInsert_L(L,i,'B');

      p=L->next;while(p!=NULL){ printf(”%c “,p->data);p=p->next;}//插入一個字符 printf(” “);i=3;ListDelete_L(L,i,e);p=L->next;while(p!=NULL){ printf(”%c “,p->data);p=p->next;} printf(” “);return 0;

      實驗結果:

      A C E F H J Q U

      A B C E F H J Q U

      A B E F H J Q U

      心得體會:

      單鏈表是通過掃描指針P進行單鏈表的操作;頭指針唯一標識點鏈表的存在;插入和刪除元素快捷,方便。

      實驗3

      實驗題目:棧操作設計和實現(xiàn)

      實驗目的:

      1、掌握棧的順序存儲結構和鏈式存儲結構,以便在實際中靈活應用。

      2、掌握棧的特點,即后進先出和先進先出的原則。

      3、掌握棧的基本運算,如:入棧與出棧等運算在順序存儲結構和鏈式存儲結構上的實現(xiàn)。

      實驗要求:

      回文判斷:對于一個從鍵盤輸入的字符串,判斷其是否為回文?;匚募凑葱蛳嗤H?/p>

      “abba”是回文,而“abab”不是回文。

      實驗主要步驟

      (1)數(shù)據(jù)從鍵盤讀入;

      (2)輸出要判斷的字符串;

      (3)利用棧的基本操作對給定的字符串判斷其是否是回文,若是則輸出“Yes”,否則輸出“No”。

      程序代碼:

      #include

      #include

      #define TRUE 1

      #define FALSE 0

      #define OK 1

      #define ERROR 0

      #define OVERFLOW-2

      #define N 100

      #define STACK_INIT_SIZE 100

      #define STACKINCREMENT 10

      typedef struct{

      int *base;// 在棧構造之前和銷毀之后,base的值為NULL int *top;// 棧頂指針

      int stacksize;// 當前已分配的存儲空間,以元素為單位

      } SqStack;

      int InitStack(SqStack &S)

      { // 構造一個空棧S

      if(!(=(int *)malloc(STACK_INIT_SIZE*sizeof(int))))

      exit(OVERFLOW);// 存儲分配失敗

      =;

      =STACK_INIT_SIZE;

      return OK;

      }

      int StackEmpty(SqStack S)

      { // 若棧S為空棧,則返回TRUE,否則返回FALSE

      if(==)

      return TRUE;

      else

      return FALSE;

      }

      int Push(SqStack &S, int e)

      { // 插入元素e為新的棧頂元素

      if(>=)// 棧滿,追加存儲空間

      {

      =(int *)realloc(,(+STACKINCREMENT)*sizeof(int));if(!)

      exit(OVERFLOW);// 存儲分配失敗

      =+;

      +=STACKINCREMENT;

      }

      *()++=e;

      return OK;

      }

      int Pop(SqStack &S,int &e)

      { // 若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERROR if(==)

      return ERROR;

      e=*--;

      return OK;

      }

      int main(){

      SqStack s;

      int i,e,j,k=1;

      char ch = {0},*p,b = {0};

      if(InitStack(s))// 初始化棧成功

      {

      printf(”請輸入表達式: “);

      gets(ch);

      p=ch;

      while(*p)// 沒到串尾

      Push(s,*p++);

      for(i=0;i

      if(!StackEmpty(s)){// 棧不空

      Pop(s,e);// 彈出棧頂元素

      b=e;

      }

      }

      for(i=0;i

      if(ch!=b)

      k=0;

      }

      if(k==0)

      printf(”NO!“);

      else

      printf(”輸出:“)

      printf(”YES!“);

      }

      return 0;

      }

      實驗結果:

      請輸入表達式:

      abcba

      輸出:YES!

      心得體會:棧是僅能在表尾驚醒插入和刪除操作的線性表,具有先進后出的性質(zhì),這個固有性質(zhì)使棧成為程序設計中的有用工具。

      實驗4

      實驗題目:二叉樹操作設計和實現(xiàn)

      實驗目的:

      掌握二叉樹的定義、性質(zhì)及存儲方式,各種遍歷算法。

      實驗要求:

      采用二叉樹鏈表作為存儲結構,完成二叉樹的建立,先序、中序和后序以及按層次遍歷的操作,求所有葉子及結點總數(shù)的操作。

      實驗主要步驟:

      1、分析、理解程序。

      2、調(diào)試程序,設計一棵二叉樹,輸入完全二叉樹的先序序列,用#代表虛結點(空指針),如ABD###CE##F##,建立二叉樹,求出先序、中序和后序以及按層次遍歷序列,求所有葉子及結點總數(shù)。

      程序代碼:

      實驗結果:

      心得體會:

      實驗5

      實驗題目:圖的遍歷操作

      實驗目的:

      掌握有向圖和無向圖的概念;掌握鄰接矩陣和鄰接鏈表建立圖的存儲結構;掌握DFS及BFS對圖的遍歷操作;了解圖結構在人工智能、工程等領域的廣泛應用。

      實驗要求:

      采用鄰接矩陣和鄰接鏈表作為圖的存儲結構,完成有向圖和無向圖的DFS和BFS操作。

      實驗主要步驟:

      設計一個有向圖和一個無向圖,任選一種存儲結構,完成有向圖和無向圖的DFS(深度優(yōu)先遍歷)和BFS(廣度優(yōu)先遍歷)的操作。

      1.鄰接矩陣作為存儲結構

      #include”“

      #include”“

      #define MaxVertexNum 100 //定義最大頂點數(shù)

      typedef struct{

      char vexs;//頂點表

      int edges;//鄰接矩陣,可看作邊表 int n,e;//圖中的頂點數(shù)n和邊數(shù)e

      }MGraph;//用鄰接矩陣表示的圖的類型

      //=========建立鄰接矩陣=======

      void CreatMGraph(MGraph *G)

      {

      int i,j,k;

      char a;

      printf(”Input VertexNum(n)and EdgesNum(e): “);

      scanf(”%d,%d“,&G->n,&G->e);//輸入頂點數(shù)和邊數(shù)

      scanf(”%c“,&a);

      printf(”Input Vertex string:“);

      for(i=0;in;i++)

      {

      scanf(”%c“,&a);

      G->vexs=a;//讀入頂點信息,建立頂點表

      }

      for(i=0;in;i++)

      for(j=0;jn;j++)

      G->edges=0;//初始化鄰接矩陣

      printf(”Input edges,Creat Adjacency Matrix “);

      for(k=0;ke;k++){ //讀入e條邊,建立鄰接矩陣

      scanf(”%d%d“,&i,&j);//輸入邊(Vi,Vj)的頂點序號

      G->edges=1;;G->edges=1;//若為;//=========定義標志向

      量,為

      量=;typedefenum{FALSE,TRUE}B;Booleanvisited=1;

      G->edges=1;//若為無向圖,矩陣為對稱矩陣;若建立有向圖,去掉該條語句 }

      }

      //=========定義標志向量,為全局變量=======

      typedef enum{FALSE,TRUE} Boolean;

      Boolean visited;

      //========DFS:深度優(yōu)先遍歷的遞歸算法======

      void DFSM(MGraph *G,int i)

      { //以Vi為出發(fā)點對鄰接矩陣表示的圖G進行DFS搜索,鄰接矩陣是0,1矩陣

      給出你的編碼

      //===========BFS:廣度優(yōu)先遍歷=======

      void BFS(MGraph *G,int k)

      { //以Vk為源點對用鄰接矩陣表示的圖G進行廣度優(yōu)先搜索

      給出你的編碼

      //==========主程序main =====

      void main()

      {

      int i;

      MGraph *G;

      G=(MGraph *)malloc(sizeof(MGraph));//為圖G請內(nèi)存空間

      CreatMGraph(G);//建立鄰接矩陣

      printf(”Print Graph DFS: “);

      DFS(G);//深度優(yōu)先遍歷

      printf(” “);

      printf(”Print Graph BFS: “);

      BFS(G,3);//以序號為3的頂點開始廣度優(yōu)先遍歷

      printf(” “);

      }

      2.鄰接鏈表作為存儲結構

      #include”“

      #include”“

      #define MaxVertexNum 50 //定義最大頂點數(shù)

      typedef struct node{ //邊表結點

      int adjvex;//鄰接點域

      struct node *next;//鏈域

      }EdgeNode;

      typedef struct vnode{ //頂點表結點

      char vertex;//頂點域

      EdgeNode *firstedge;//邊表頭指針

      }VertexNode;

      typedef VertexNode AdjList;//AdjList是鄰接表類型 typedef struct {

      AdjList adjlist;//鄰接表

      int n,e;//圖中當前頂點數(shù)和邊數(shù)

      } ALGraph;//圖類型

      //=========建立圖的鄰接表=======

      void CreatALGraph(ALGraph *G)

      {

      int i,j,k;

      char a;

      EdgeNode *s;//定義邊表結點

      printf(”Input VertexNum(n)and EdgesNum(e): “);

      scanf(”%d,%d“,&G->n,&G->e);//讀入頂點數(shù)和邊數(shù)

      scanf(”%c“,&a);

      printf(”Input Vertex string:“);

      for(i=0;in;i++)//建立邊表

      {

      scanf(”%c“,&a);

      G->adjlist.vertex=a;//讀入頂點信息

      G->adjlist.firstedge=NULL;//邊表置為空表

      }

      printf(”Input edges,Creat Adjacency List “);

      for(k=0;ke;k++){ //建立邊表

      scanf(”%d%d“,&i,&j);//讀入邊(Vi,Vj)的頂點對序號

      s=(EdgeNode *)malloc(sizeof(EdgeNode));//生成邊表結點

      s->adjvex=j;//鄰接點序號為j

      s->next=G->adjlist.firstedge;

      G->adjlist.firstedge=s;//將新結點*S插入頂點Vi的邊表頭部

      s=(EdgeNode *)malloc(sizeof(EdgeNode));

      s->adjvex=i;//鄰接點序號為i

      s->next=G->adjlist.firstedge;

      G->adjlist.firstedge=s;//將新結點*S插入頂點Vj的邊表頭部

      }

      }

      //=========定義標志向量,為全局變量=======

      typedef enum{FALSE,TRUE} Boolean;

      Boolean visited;

      //========DFS:深度優(yōu)先遍歷的遞歸算法======

      void DFSM(ALGraph *G,int i)

      { //以Vi為出發(fā)點對鄰接鏈表表示的圖G進行DFS搜索

      給出你的編碼

      //==========BFS:廣度優(yōu)先遍歷=========

      void BFS(ALGraph *G,int k)

      { //以Vk為源點對用鄰接鏈表表示的圖G進行廣度優(yōu)先搜索

      給出你的編碼

      //==========主函數(shù)===========

      void main()

      {

      int i;

      ALGraph *G;

      G=(ALGraph *)malloc(sizeof(ALGraph));

      CreatALGraph(G);

      printf(”Print Graph DFS: “);

      DFS(G);

      printf(” “);

      printf(”Print Graph BFS: “);

      BFS(G,3);

      printf(” ");

      }

      實驗結果:

      1.鄰接矩陣作為存儲結構

      2.鄰接鏈表作為存儲結構

      心得體會:

      實驗6

      實驗題目:二分查找算法的實現(xiàn)

      實驗目的:

      掌握二分查找法的工作原理及應用過程,利用其工作原理完成實驗題目中的內(nèi)容。

      實驗要求:

      編寫程序構造一個有序表L,從鍵盤接收一個關鍵字key,用二分查找法在L中查找key,若找到則提示查找成功并輸出key所在的位置,否則提示沒有找到信息。

      實驗主要步驟:

      1.建立的初始查找表可以是無序的,如測試的數(shù)據(jù)為{3,7,11,15,17,21,35,42,50}或者{11,21,7,3,15,50,42,35,17}。

      2.給出算法的遞歸和非遞歸代碼;

      3.如何利用二分查找算法在一個有序表中插入一個元素x,并保持表的有序性?

      程序代碼

      實驗結果:

      心得體會:

      實驗7

      實驗題目:排序

      實驗目的:

      掌握各種排序方法的基本思想、排序過程、算法實現(xiàn),能進行時間和空間性能的分析,根據(jù)實際問題的特點和要求選擇合適的排序方法。

      實驗要求:

      實現(xiàn)直接排序、冒泡、直接選擇、快速、堆、歸并排序算法。比較各種算法的運行速度。

      實驗主要步驟:

      程序代碼

      實驗結果:

      心得體會:

      第三篇:數(shù)據(jù)結構實驗報告(報告+C語言源代碼)

      目錄

      前言..................................................................................................................2 概要設計..................................................................................................................3 1.1 數(shù)據(jù)結構設計...........................................................................................3 2.1 算法設計...................................................................................................3 2.1.1 建立鏈表的算法..............................................................................3 2.1.2 鏈表插入一個元素的算法..............................................................3 2.1.3 鏈表刪除一個元素的算法..............................................................3 3.1 ADT描述..................................................................................................4

      4.1

      詳細設計…………………………………………… ……………………………… 4

      4.1.1

      數(shù)據(jù)存儲結構……………………………… ……………………………… 4.4.1.2

      主要偽代碼…… …………………… ……………………………………… 4 軟件測試..................................................................................................................7 心得體會................................................................................................................11 源代碼...................................................................................................................12 參考文獻………………………………………………………………………...21

      前言

      數(shù)據(jù)結構是計算機程序設計的重要理論技術基礎,它不僅是計算機學科的核心課程,而且已經(jīng)成為其他理工專業(yè)的熱門選修課。

      隨著計算機科學的技術和發(fā)展,計算機的功能和運算速度不斷地提高,其應用于信息處理的范圍日益擴大。與之相應的,計算機的加工處理對象也從簡單的數(shù)據(jù)發(fā)展到一般的符號,進而發(fā)展到更復雜的數(shù)據(jù)結構。數(shù)據(jù)結構是計算機程序設計的重要理論技術基礎,數(shù)據(jù)結構的表示和操作都涉及到算法,如何描述數(shù)據(jù)的結構和討論有關的算法,又涉及到程序設計語言。因此,它不僅是計算機學科的核心課程,而且已經(jīng)成為其他理工專業(yè)的熱門選修課。我們通過對這門基礎課程的學習,要學會分析研究計算機加工的數(shù)據(jù)結構的特性,以便為應用涉及的數(shù)據(jù)選擇適合的邏輯結構,儲存結構及其相應的算法,并初步掌握算法時間分析和空間分析的技術。通過實際操作去了解數(shù)據(jù)結構原理,練習編寫代碼的能力,以及抽象能力。

      從課程性質(zhì)上講,“數(shù)據(jù)結構”是一門專業(yè)技術基礎課。它的要求是學會分析研究計算機加工的數(shù)據(jù)結構的特性,以便為應用涉及的數(shù)據(jù)選擇適當?shù)倪壿嫿Y構,存儲結構及相應的算法,并初步掌握算法的時間分析和空間分析的技術。另一方面,數(shù)據(jù)結構的學習過程也是復雜程序設計的訓練過程,要求編寫的程序結構清楚和正確易讀,符合軟件工程的規(guī)范。

      概要設計

      1.1 數(shù)據(jù)結構設計

      采用鏈式儲存結構。typedef struct LNode{ ElemType data;struct LNode *next;}LNode,*LinkList;2.1 算法設計

      2.1.1 建立鏈表的算法

      (1)算法思想分析

      首先從表尾到表頭逆向建立單鏈表,然后再建立的單鏈表基礎上進行對鏈表上的元素進行查詢,刪除,插入的操作。(2)要點描述

      首先建立一個帶頭結點的單鏈表,通過申請內(nèi)存,先建立一個空鏈表。然后結點的插入,建立一個有多個結點的鏈表。在進行查詢等操作。(3)時間和空間復雜度分析

      程序的時間復雜度為O(n)。

      2.1.2 鏈表插入一個元素的算法

      (1)算法思想分析

      要生成一個新數(shù)據(jù)域為X的結點,然后插入在單鏈表中。(2)要點描述

      在鏈表中插入結點只需要修改指針。若要在第 i 個結點之前插入元素,修改的是第 i-1 個結點的指針。

      (3)時間和空間復雜度分析

      時間復雜度O(n)2.1.3 鏈表刪除一個元素的算法

      (1)算法思想分析

      要刪除一個結點,必須修改指針并且釋放空間。(2)要點描述

      找到線性表中第i-1個結點,修改其指向后繼的指針。

      (3)時間和空間復雜度分析

      時間復雜度O(n)

      3.1 ADT描述

      ADT LinkList{

      數(shù)據(jù)對象:D={ e | e∈LNode }

      數(shù)據(jù)關系:R1={ | e∈LNode ,e >0}

      基本操作:

      GreateList_L(&L, n)

      操作結果:構造了一個長為n的數(shù)據(jù)鏈表

      ListDelete_L(&L, i, &e)

      初始條件:鏈表L已存在而且非空

      操作結果:刪除L的第i個數(shù)據(jù),并且用e返回其值

      ListInsert_L(&L, i, e)

      初始條件:鏈表L已存在

      操作結果: 在L的第i個位置插入數(shù)據(jù)e

      GetElem(L, i, e)

      初始條件:鏈表L已存在

      操作結果:用e返回L中的第i個數(shù)據(jù) }ADT LinkList

      4.1

      詳細設計 4.1.1數(shù)據(jù)存儲結構設計

      采用單鏈式線性表實現(xiàn)

      4.1.2

      主要偽代碼

      Status GetElem(LinkList L, int i, ElemType *e){ int j=0;int d;LinkList p = L;while(p&&jnext;j++;

      } if(!p || j > i)return ERROR;printf(“您要查詢的元素是:n”);d=p->data;printf(“%d”,d);printf(“n”);}

      void InitList(LinkList *L){ *L =(LinkList)malloc(sizeof(struct LNode));if(!*L)exit(OVERFLOW);(*L)->next = NULL;}

      Status ListInsert(LinkList L, int i, ElemType e){ int j = 0;LinkList p = L, s;while(p && j < i-1){ p = p->next;j++;} if(!p|| j > i-1)return ERROR;s =(LinkList)malloc(sizeof(struct LNode));s->data = e;s->next = p->next;p->next = s;return OK;}

      Status ListDelete(LinkList L, int i, ElemType *e){ int j = 0;LinkList p = L, q;while(p->next && j < i-1){ p = p->next;

      j++;} if(!p->next || j > i-1)return ERROR;q = p->next;p->next = q->next;*e = q->data;free(q);return OK;}

      void ListTraverse(LinkList L, void(*vi)(ElemType)){ LinkList p = L->next;while(p){ vi(p->data);p = p->next;} printf(“n”);}

      void ListPrint(LinkList L){ LinkList p = L->next;while(p){ printf(“%d ”, p->data);p = p->next;} printf(“n”);}

      void printInt(int data){ printf(“%d ”, data);}.軟件測試

      圖一(主界面)

      圖二(插入學生信息)

      圖三(顯示所有學生信息)

      圖四(查詢個人信息)

      圖五(統(tǒng)計信息)

      圖六(修改信息)

      圖七(保存數(shù)據(jù))

      圖八(刪除信息)

      心得體會

      通過本程序的設計,我對數(shù)據(jù)結構作了以下總結:要解決一道程序題必須先要認真捕捉改程序中的有用信息,找出解決方法。先規(guī)劃好,程序需要什么樣的數(shù)據(jù)結構,什么函數(shù),對程序有什么要求。然后從整體把握對程序設計進行分工,相應地把程序分成若干模塊,具體實現(xiàn)各部分實行相應的功能。一個程序要順利地進行設計,一是要對程序的功能有全面的了解,如果漏了某些部分,都會使得這個程序調(diào)試不出來或者是令該程序沒有達到預想的效果。其次,在程序的編譯中,必須注重程序設計過程中的細節(jié),像單鏈表的程序,就要理解鏈表的概念,理解鏈表的數(shù)據(jù)特點,要清楚知道數(shù)據(jù)域和指針域的作用,否則,很容易會浪費大量時間在檢測錯誤上面。要說到解題的思考方向,如果要總結成規(guī)律,我認為要靈活的進行方法的設計,通過不同的方法來實現(xiàn)不同的功能,如通過結點的插入來實現(xiàn)鏈表的創(chuàng)建。同時應該注意各種語句的選擇,要先預想好需要什么樣的語句來實現(xiàn)函數(shù)定義,盡量簡單快捷地完成,避免出錯。

      要規(guī)范面向對象程序設計師的書寫協(xié)管,在這次課程設計中,我們再次感受到,規(guī)范的程序書寫,可以更好的進行后期的差錯補漏。還應該注意各種面向對象語言語法的運用,例如繼承的方法,都要嚴格按照語法來進行,否則很容易就會出現(xiàn)錯誤,甚至嚴重影響課程設計的進度。

      源代碼

      #include “stdio.h” #include “stdlib.h” #include “string.h” int shoudsave=0;// struct student {

      char num[10];//學號

      char name[20];

      char sex[4];

      int cgrade;

      int mgrade;

      int egrade;

      int totle;

      int ave;

      char neartime[10];//最近更新時間

      };

      typedef struct node {

      struct student data;

      struct node *next;}Node,*Link;

      int menu(){

      char m[3];

      int n;

      printf(“ ************************歡迎進入學生成績管理系統(tǒng)******************************nn”);

      printf(“t歡迎使用本學生管理系統(tǒng),本系統(tǒng)將為您提供歷史學生信息查詢,學生成績信息管理功能。n”);

      printf(“********************************************************************************”);

      printf(“t1輸入學生資料ttttt2刪除學生資料n”);

      printf(“t3查詢學生資料ttttt4修改學生資料n”);

      printf(“t5顯示學生資料ttttt6統(tǒng)計學生成績n”);

      printf(“t7保存學生資料n”);

      printf(“ttplease choose a operation(1-7):n”);

      printf(“***********************************************************************

      *********n”);

      scanf(“%s”,m);

      n=atoi(m);

      return(n);}

      void printstart(){

      printf(“---------n”);}

      void Wrong(){

      printf(“n=====>提示:輸入錯誤!n”);}

      void Nofind(){

      printf(“n=====>提示:沒有找到該學生!n”);}

      void printc()// 本函數(shù)用于輸出中文

      {

      printf(“學號t 姓名

      性別

      英語成績 數(shù)據(jù)庫成績 數(shù)據(jù)結構成績

      總分平均分n”);}

      void printe(Node *p)//本函數(shù)用于輸出英文

      {

      printf(“%-12s%stt%st%dtt%dt%dt%dt %dn”,p->data.num,p->data.name,p->data.sex,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.totle,p->data.ave);}

      Node* Locate(Link l,char findmess[],char nameornum[])//該函數(shù)用于定位連表中符合要求的接點,并返回該指針

      {

      Node *r;

      if(strcmp(nameornum,“num”)==0)//按學號查詢

      {

      r=l->next;

      while(r!=NULL)

      {

      if(strcmp(r->data.num,findmess)==0)

      return r;

      r=r->next;

      }

      }

      else if(strcmp(nameornum,“name”)==0)//按姓名查詢

      {

      r=l->next;

      while(r!=NULL)

      {

      if(strcmp(r->data.name,findmess)==0)

      return r;

      r=r->next;

      }

      }

      return 0;}

      void Add(Link l)//增加學生

      {

      Node *p,*r,*s;

      char num[10];

      r=l;

      s=l->next;

      while(r->next!=NULL)

      r=r->next;//將指針置于最末尾

      while(1)

      {

      printf(“請你輸入學號(以'0'返回上一級菜單:)”);

      scanf(“%s”,num);

      if(strcmp(num,“0”)==0)

      break;

      while(s)

      {

      if(strcmp(s->data.num,num)==0)

      {

      printf(“=====>提示:學號為'%s'的學生已經(jīng)存在,若要修改請你選擇'4 修改'!n”,num);

      printstart();

      printc();

      printe(s);

      printstart();

      printf(“n”);

      return;

      }

      s=s->next;

      }

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

      strcpy(p->data.num,num);

      printf(“請你輸入姓名:”);

      scanf(“%s”,p->data.name);

      getchar();

      printf(“請你輸入性別:”);

      scanf(“%s”,p->data.sex);

      getchar();

      printf(“請你輸入數(shù)據(jù)結構成績:”);

      scanf(“%d”,&p->data.cgrade);

      getchar();

      printf(“請你輸入數(shù)據(jù)庫成績:”);

      scanf(“%d”,&p->data.mgrade);

      getchar();

      printf(“請你輸入英語成績:”);

      scanf(“%d”,&p->data.egrade);

      getchar();

      p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;

      p->data.ave=p->data.totle / 3;

      //信息輸入已經(jīng)完成p->next=NULL;

      r->next=p;

      r=p;

      shoudsave=1;

      } }

      void Qur(Link l)//查詢學生

      {

      char findmess[20];

      Node *p;

      if(!l->next)

      {

      printf(“n=====>提示:沒有資料可以查詢!n”);

      return;

      }

      printf(“請你輸入要查找的學號:”);

      scanf(“%s”,findmess);

      p=Locate(l,findmess,“num”);

      if(p)

      {

      printf(“tttt查找結果n”);

      printstart();

      printc();

      printe(p);

      printstart();

      }

      else

      Nofind();}

      void Del(Link l)//刪除

      {

      Node *p,*r;

      char findmess[20];

      if(!l->next)

      {

      printf(“n=====>提示:沒有資料可以刪除!n”);

      return;

      }

      printf(“n=====>確定進行刪除操作請按 1,按其他按鍵退出該操作nnnn”);

      if(menu()==1)

      {

      printf(“請你輸入要刪除的學號:”);

      scanf(“%s”,findmess);

      p=Locate(l,findmess,“num”);

      if(p)

      {

      r=l;

      while(r->next!=p)

      r=r->next;

      r->next=p->next;

      free(p);

      printf(“n=====>提示:該學生已經(jīng)成功刪除!n”);

      shoudsave=1;

      }

      else

      Nofind();

      }

      else

      exit;}

      void Modify(Link l)//修改函數(shù) {

      Node *p;

      char findmess[20];

      if(!l->next)

      {

      printf(“n=====>提示:沒有資料可以修改!n”);

      return;

      }

      printf(“請你輸入要修改的學生學號:”);

      scanf(“%s”,findmess);

      p=Locate(l,findmess,“num”);

      if(p)

      {

      printf(“請你輸入新學號(原來是%s):”,p->data.num);

      scanf(“%s”,p->data.num);

      printf(“請你輸入新姓名(原來是%s):”,p->data.name);

      scanf(“%s”,p->data.name);

      getchar();

      printf(“請你輸入新性別(原來是%s):”,p->data.sex);

      scanf(“%s”,p->data.sex);

      printf(“請你輸入新的數(shù)據(jù)結構成績(原來是%d分):”,p->data.cgrade);

      scanf(“%d”,&p->data.cgrade);

      getchar();

      printf(“請你輸入新的數(shù)據(jù)庫成績(原來是%d分):”,p->data.mgrade);

      scanf(“%d”,&p->data.mgrade);

      getchar();

      printf(“請你輸入新的英語成績(原來是%d分):”,p->data.egrade);

      scanf(“%d”,&p->data.egrade);

      p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;

      p->data.ave=p->data.totle/3;

      printf(“n=====>提示:資料修改成功!n”);

      shoudsave=1;

      }

      else

      Nofind();

      }

      void Disp(Link l)//顯示函數(shù) {

      int count=0;

      Node *p;

      p=l->next;

      if(!p)

      {

      printf(“n=====>提示:沒有資料可以顯示!n”);

      return;

      }

      printf(“tttt顯示結果n”);

      printstart();

      printc();

      printf(“n”);

      while(p)

      {

      printe(p);

      p=p->next;

      }

      printstart();

      printf(“n”);}

      void Tongji(Link l)//統(tǒng)計函數(shù) {

      Node *pm,*pe,*pc,*pt,*pa;//用于指向分數(shù)最高的接點

      Node *r=l->next;

      if(!r)

      {

      printf(“n=====>提示:沒有資料可以統(tǒng)計!n”);

      return;

      }

      pm=pe=pc=pt=pa=r;

      while(r!=NULL)

      {

      if(r->data.cgrade>=pc->data.cgrade)

      pc=r;

      if(r->data.mgrade>=pm->data.mgrade)

      pm=r;

      if(r->data.egrade>=pe->data.egrade)

      pe=r;

      if(r->data.totle>=pt->data.totle)

      pt=r;

      if(r->data.ave>=pa->data.ave)

      pa=r;

      r=r->next;

      }

      printf(“------------------------------統(tǒng)計結果-n”);

      printf(“總分最高者:t%s %d分n”,pt->data.name,pt->data.totle);

      printf(“平均分最高者:t%s %d分n”,pa->data.name,pa->data.ave);

      printf(“英語最高者:t%s %d分n”,pe->data.name,pe->data.egrade);

      printf(“數(shù)據(jù)庫最高者:t%s %d分n”,pm->data.name,pm->data.mgrade);

      printf(“數(shù)據(jù)結構最高者:t%s %d分n”,pc->data.name,pc->data.cgrade);

      printstart();}

      void Save(Link l)//保存函數(shù) {

      FILE* fp;

      Node *p;

      int flag=1,count=0;

      fp=fopen(“c:student”,“wb”);

      if(fp==NULL)

      {

      printf(“n=====>提示:重新打開文件時發(fā)生錯誤!n”);

      exit(1);

      }

      p=l->next;

      while(p)

      {

      if(fwrite(p,sizeof(Node),1,fp)==1)

      {

      p=p->next;

      count++;

      }

      else

      {

      flag=0;

      break;

      }

      }

      if(flag)

      {

      printf(“n=====>提示:文件保存成功.(有%d條記錄已經(jīng)保存.)n”,count);

      shoudsave=0;

      }

      fclose(fp);}

      void main(){

      Link l;//連表

      FILE *fp;//文件指針

      char ch;

      char jian;

      int count=0;

      Node *p,*r;

      l=(Node*)malloc(sizeof(Node));

      l->next=NULL;

      r=l;

      fp=fopen(“C:student”,“rb”);

      if(fp==NULL)

      {

      fp=fopen(“C:student”,“wb”);

      exit(0);

      }

      printf(“n=====>提示:文件已經(jīng)打開,正在導入記錄......n”);

      while(!feof(fp))

      {

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

      if(fread(p,sizeof(Node),1,fp))//將文件的內(nèi)容放入接點中

      {

      p->next=NULL;

      r->next=p;

      r=p;//將該接點掛入連中

      count++;

      }

      }

      fclose(fp);//關閉文件

      printf(“n=====>提示:記錄導入完畢,共導入%d條記錄.n”,count);

      for(;;)

      {

      switch(menu())

      {

      case 1:Add(l);break;//增加學生

      case 2:Del(l);break;//刪除學生

      case 3:Qur(l);break;//查詢學生

      case 4:Modify(l);break;//修改學生

      case 5:Disp(l);break;//顯示學生

      case 6:Tongji(l);break;//統(tǒng)計學生

      case 7:Save(l);break;//保存學生

      default: Wrong();

      getchar();

      break;

      }

      }

      }

      參考文獻

      《數(shù)據(jù)結構(C語言版)》----------------清華大學出版社 嚴蔚敏 吳偉民 編著 《C語言程序設計》------------------------中國鐵道出版社 丁峻嶺 余堅 編著

      第四篇:數(shù)據(jù)結構(C語言版) 實驗報告

      數(shù)據(jù)結構(C語言版)實驗報告

      專業(yè):計算機科學與技術、軟件工程

      學號:____201240703061___________________

      班級:_________軟件二班______________ 姓名:________朱海霞______________ 指導教師:___劉遵仁________________

      青島大學信息工程學院

      2013年10月

      實驗1

      實驗題目:順序存儲結構線性表的插入和刪除

      實驗目的:

      了解和掌握線性表的邏輯結構和順序存儲結構,掌握線性表的基本算法及相關的時間性能分析。

      實驗要求:

      建立一個數(shù)據(jù)域定義為整數(shù)類型的線性表,在表中允許有重復的數(shù)據(jù);根據(jù)輸入的數(shù)據(jù),先找到相應的存儲單元,后刪除之。

      實驗主要步驟:

      1、分析、理解給出的示例程序。

      2、調(diào)試程序,并設計輸入一組數(shù)據(jù)(3,-5,6,8,2,-5,4,7,-9),測試程序的如下功能:根據(jù)輸入的數(shù)據(jù),找到相應的存儲單元并刪除,顯示表中所有的數(shù)據(jù)。

      程序代碼:

      #include #include #define OK 1 #define ERROR 0 #define OVERFLOW-2 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct{ int* elem;int length;int listsize;}Sqlist;int InitList_Sq(Sqlist &L){ L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));if(!L.elem)return-1;L.length=0;L.listsize=LIST_INIT_SIZE;return OK;} int ListInsert_Sq(Sqlist&L,int i,int e){ if(i<1||i>L.length+1)return ERROR;if(L.length==L.listsize){

      int *newbase;

      newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));

      if(!newbase)return-1;

      L.elem=newbase;

      L.listsize+=LISTINCREMENT;} int *p,*q;q=&(L.elem[i-1]);for(p=&(L.elem[L.length-1]);p>=q;--p)

      *(p+1)=*p;*q=e;++L.length;return OK;} int ListDelete_Sq(Sqlist &L,int i,int e){ int *p,*q;if(i<1||i>L.length)return ERROR;p=&(L.elem[i-1]);e=*p;q=L.elem+L.length-1;for(++p;p<=q;++p)

      *(p-1)=*p;--L.length;return OK;} int main(){ Sqlist L;InitList_Sq(L);//初始化

      int i,a[]={3,-5,6,8,2,-5,4,7,-9};for(i=1;i<10;i++)

      ListInsert_Sq(L,i,a[i-1]);for(i=0;i<9;i++)

      printf(“ %d”,L.elem[i]);

      printf(“n”);//插入9個數(shù)

      ListInsert_Sq(L,3,24);for(i=0;i<10;i++)

      printf(“ %d”,L.elem[i]);

      printf(“n”);//插入一個數(shù)

      int e;ListDelete_Sq(L,2, e);for(i=0;i<9;i++)

      printf(“ %d”,L.elem[i]);//刪除一個數(shù)

      printf(“n”);

      return 0;}

      實驗結果:

      3,-5,6,8,2,-5,4,7,-9 3,-5,24,6,8,2,-5,4,7,-9 3,24,6,8,2,-5,4,7,-9

      心得體會:

      順序存儲結構是一種隨機存取結構,存取任何元素的時間是一個常數(shù),速度快;結構簡單,邏輯上相鄰的元素在物理上也相鄰;不使用指針,節(jié)省存儲空間;但是插入和刪除元素需要移動大量元素,消耗大量時間;需要一個連續(xù)的存儲空間;插入元素可能發(fā)生溢出;自由區(qū)中的存儲空間不能被其他數(shù)據(jù)共享

      實驗2

      實驗題目:單鏈表的插入和刪除

      實驗目的:

      了解和掌握線性表的邏輯結構和鏈式存儲結構,掌握單鏈表的基本算法及相關的時間性能分析。

      實驗要求:

      建立一個數(shù)據(jù)域定義為字符類型的單鏈表,在鏈表中不允許有重復的字符;根據(jù)輸入的字符,先找到相應的結點,后刪除之。

      實驗主要步驟:

      3、分析、理解給出的示例程序。

      4、調(diào)試程序,并設計輸入數(shù)據(jù)(如:A,C,E,F(xiàn),H,J,Q,M),測試程序的如下功能:不允許重復字符的插入;根據(jù)輸入的字符,找到相應的結點并刪除。

      5、修改程序:

      (1)增加插入結點的功能。

      (2)建立鏈表的方法有“前插”、“后插”法。

      程序代碼: #include #include #define NULL 0 #define OK 1 #define ERROR 0 typedef struct LNode{

      int data;

      struct LNode *next;}LNode,*LinkList;int InitList_L(LinkList &L){ L=(LinkList)malloc(sizeof(LNode));L->next=NULL;return OK;} int ListInsert_L(LinkList &L,int i,int e){ LinkList p,s;int j;p=L;j=0;while(p&&j

      p=p->next;++j;} if(!p||j>i-1)

      return ERROR;s=(LinkList)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;return OK;} int ListDelete_L(LinkList&L,int i,int &e){ LinkList p,q;int j;p=L;j=0;while(p->next&&j

      p=p->next;++j;} if(!(p->next)||j

      return ERROR;q=p->next;p->next=q->next;e=q->data;free(q);return OK;} int main(){ LinkList L,p;char a[8]={'A','C','E','F','H','J','Q','U'};int i,j;InitList_L(L);for(i=1,j=0;i<=8,j<8;i++,j++)

      ListInsert_L(L,i,a[j]);p=L->next;while(p!=NULL){

      printf(“%ct”,p->data);

      p=p->next;

      }

      }//插入八個字符 printf(“n”);i=2;int e;ListInsert_L(L,i,'B');p=L->next;while(p!=NULL){ printf(“%ct”,p->data);p=p->next;}//插入一個字符 printf(“n”);i=3;ListDelete_L(L,i,e);p=L->next;while(p!=NULL){ printf(“%ct”,p->data);p=p->next;} printf(“n”);return 0;實驗結果:

      A C E F H J Q U A B C E F H J Q U A B E F H J Q U

      心得體會:

      單鏈表是通過掃描指針P進行單鏈表的操作;頭指針唯一標識點鏈表的存在;插入和刪除元素快捷,方便。

      實驗3

      實驗題目:棧操作設計和實現(xiàn)

      實驗目的:

      1、掌握棧的順序存儲結構和鏈式存儲結構,以便在實際中靈活應用。

      2、掌握棧的特點,即后進先出和先進先出的原則。

      3、掌握棧的基本運算,如:入棧與出棧等運算在順序存儲結構和鏈式存儲結構上的實現(xiàn)。

      實驗要求:

      回文判斷:對于一個從鍵盤輸入的字符串,判斷其是否為回文?;匚募凑葱蛳嗤?。如“abba”是回文,而“abab”不是回文。

      實驗主要步驟

      (1)數(shù)據(jù)從鍵盤讀入;(2)輸出要判斷的字符串;

      (3)利用棧的基本操作對給定的字符串判斷其是否是回文,若是則輸出“Yes”,否則輸出“No”。

      程序代碼: #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW-2 #define N 100 #define STACK_INIT_SIZE 100

      #define STACKINCREMENT 10

      typedef struct{

      int *base;

      // 在棧構造之前和銷毀之后,base的值為NULL

      int *top;

      // 棧頂指針

      int

      stacksize;

      // 當前已分配的存儲空間,以元素為單位

      } SqStack;

      int InitStack(SqStack &S){ // 構造一個空棧S

      if(!(S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int))))

      exit(OVERFLOW);

      // 存儲分配失敗

      S.top=S.base;

      S.stacksize=STACK_INIT_SIZE;

      return OK;

      }

      int StackEmpty(SqStack S){ // 若棧S為空棧,則返回TRUE,否則返回FALSE

      if(S.top==S.base)

      return TRUE;

      else

      return FALSE;}

      int Push(SqStack &S, int e){ // 插入元素e為新的棧頂元素

      if(S.top-S.base>=S.stacksize)// 棧滿,追加存儲空間

      {

      S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));

      if(!S.base)

      exit(OVERFLOW);// 存儲分配失敗

      S.top=S.base+S.stacksize;

      S.stacksize+=STACKINCREMENT;

      }

      *(S.top)++=e;

      return OK;}

      int Pop(SqStack &S,int &e){ // 若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERROR

      if(S.top==S.base)

      return ERROR;

      e=*--S.top;

      return OK;} int main(){

      SqStack s;

      int i,e,j,k=1;

      char ch[N] = {0},*p,b[N] = {0};

      if(InitStack(s))// 初始化棧成功

      {

      printf(“請輸入表達式:n”);

      gets(ch);

      p=ch;

      while(*p)// 沒到串尾

      Push(s,*p++);

      for(i=0;i

      if(!StackEmpty(s)){// 棧不空

      Pop(s,e);// 彈出棧頂元素

      b[i]=e;

      }

      }

      for(i=0;i

      if(ch[i]!=b[i])

      k=0;}

      if(k==0)

      printf(“NO!”);

      else

      printf(“輸出:”)printf(“YES!”);

      }

      return 0;

      }

      實驗結果:

      請輸入表達式: abcba 輸出:YES!心得體會:棧是僅能在表尾驚醒插入和刪除操作的線性表,具有先進后出的性質(zhì),這個固有性質(zhì)使棧成為程序設計中的有用工具。

      實驗4

      實驗題目:二叉樹操作設計和實現(xiàn)

      實驗目的:

      掌握二叉樹的定義、性質(zhì)及存儲方式,各種遍歷算法。

      實驗要求:

      采用二叉樹鏈表作為存儲結構,完成二叉樹的建立,先序、中序和后序以及按層次遍歷的操作,求所有葉子及結點總數(shù)的操作。

      實驗主要步驟:

      1、分析、理解程序。

      2、調(diào)試程序,設計一棵二叉樹,輸入完全二叉樹的先序序列,用#代表虛結點(空指針),如ABD###CE##F##,建立二叉樹,求出先序、中序和后序以及按層次遍歷序列,求所有葉子及結點總數(shù)。

      程序代碼:

      實驗結果:

      心得體會:

      實驗5

      實驗題目:圖的遍歷操作

      實驗目的:

      掌握有向圖和無向圖的概念;掌握鄰接矩陣和鄰接鏈表建立圖的存儲結構;掌握DFS及BFS對圖的遍歷操作;了解圖結構在人工智能、工程等領域的廣泛應用。

      實驗要求:

      采用鄰接矩陣和鄰接鏈表作為圖的存儲結構,完成有向圖和無向圖的DFS和BFS操作。

      實驗主要步驟:

      設計一個有向圖和一個無向圖,任選一種存儲結構,完成有向圖和無向圖的DFS(深度優(yōu)先遍歷)和BFS(廣度優(yōu)先遍歷)的操作。

      1. 鄰接矩陣作為存儲結構 #include“stdio.h” #include“stdlib.h” #define MaxVertexNum 100

      //定義最大頂點數(shù) typedef struct{

      char vexs[MaxVertexNum];

      //頂點表

      int edges[MaxVertexNum][MaxVertexNum];

      //鄰接矩陣,可看作邊表

      int n,e;

      //圖中的頂點數(shù)n和邊數(shù)e }MGraph;

      //用鄰接矩陣表示的圖的類型 //=========建立鄰接矩陣======= void CreatMGraph(MGraph *G){

      int i,j,k;

      char a;

      printf(“Input VertexNum(n)and EdgesNum(e): ”);

      scanf(“%d,%d”,&G->n,&G->e);

      //輸入頂點數(shù)和邊數(shù)

      scanf(“%c”,&a);

      printf(“Input Vertex string:”);

      for(i=0;in;i++)

      {

      scanf(“%c”,&a);

      G->vexs[i]=a;

      //讀入頂點信息,建立頂點表

      }

      for(i=0;in;i++)

      for(j=0;jn;j++)

      G->edges[i][j]=0;

      //初始化鄰接矩陣

      printf(“Input edges,Creat Adjacency Matrixn”);

      for(k=0;ke;k++){

      //讀入e條邊,建立鄰接矩陣

      scanf(“%d%d”,&i,&j);

      //輸入邊(Vi,Vj)的頂點序號

      G->edges[i][j]=1;

      G->edges[j][i]=1;//若為無向圖,矩陣為對稱矩陣;若建立有向圖,去掉該條語句

      } } //=========定義標志向量,為全局變量======= typedef enum{FALSE,TRUE} Boolean;Boolean visited[MaxVertexNum];//========DFS:深度優(yōu)先遍歷的遞歸算法====== void DFSM(MGraph *G,int i){ //以Vi為出發(fā)點對鄰接矩陣表示的圖G進行DFS搜索,鄰接矩陣是0,1矩陣

      給出你的編碼

      //===========BFS:廣度優(yōu)先遍歷======= void BFS(MGraph *G,int k){ //以Vk為源點對用鄰接矩陣表示的圖G進行廣度優(yōu)先搜索

      給出你的編碼

      //==========主程序main ===== void main(){

      int i;

      MGraph *G;

      G=(MGraph *)malloc(sizeof(MGraph));

      //為圖G申請內(nèi)存空間

      CreatMGraph(G);

      //建立鄰接矩陣

      printf(“Print Graph DFS: ”);

      DFS(G);

      //深度優(yōu)先遍歷

      printf(“n”);

      printf(“Print Graph BFS: ”);

      BFS(G,3);

      //以序號為3的頂點開始廣度優(yōu)先遍歷

      printf(“n”);}

      2. 鄰接鏈表作為存儲結構 #include“stdio.h” #include“stdlib.h” #define MaxVertexNum 50

      //定義最大頂點數(shù) typedef struct node{

      //邊表結點

      int adjvex;

      //鄰接點域

      struct node *next;

      //鏈域 }EdgeNode;typedef struct vnode{

      //頂點表結點

      char vertex;

      //頂點域

      EdgeNode *firstedge;

      //邊表頭指針 }VertexNode;typedef VertexNode AdjList[MaxVertexNum];

      //AdjList是鄰接表類型 typedef struct {

      AdjList adjlist;

      //鄰接表

      int n,e;

      //圖中當前頂點數(shù)和邊數(shù) } ALGraph;

      //圖類型 //=========建立圖的鄰接表======= void CreatALGraph(ALGraph *G){

      int i,j,k;

      char a;

      EdgeNode *s;

      //定義邊表結點

      printf(“Input VertexNum(n)and EdgesNum(e): ”);

      scanf(“%d,%d”,&G->n,&G->e);

      //讀入頂點數(shù)和邊數(shù)

      scanf(“%c”,&a);

      printf(“Input Vertex string:”);

      for(i=0;in;i++)

      //建立邊表

      { scanf(“%c”,&a);G->adjlist[i].vertex=a;

      //讀入頂點信息

      G->adjlist[i].firstedge=NULL;//邊表置為空表

      }

      printf(“Input edges,Creat Adjacency Listn”);

      for(k=0;ke;k++){

      //建立邊表

      scanf(“%d%d”,&i,&j);

      //讀入邊(Vi,Vj)的頂點對序號

      s=(EdgeNode *)malloc(sizeof(EdgeNode));

      //生成邊表結點

      s->adjvex=j;

      //鄰接點序號為j s->next=G->adjlist[i].firstedge;G->adjlist[i].firstedge=s;

      //將新結點*S插入頂點Vi的邊表頭部

      s=(EdgeNode *)malloc(sizeof(EdgeNode));

      s->adjvex=i;

      //鄰接點序號為i s->next=G->adjlist[j].firstedge;

      G->adjlist[j].firstedge=s;

      //將新結點*S插入頂點Vj的邊表頭部

      } } //=========定義標志向量,為全局變量======= typedef enum{FALSE,TRUE} Boolean;Boolean visited[MaxVertexNum];//========DFS:深度優(yōu)先遍歷的遞歸算法====== void DFSM(ALGraph *G,int i){ //以Vi為出發(fā)點對鄰接鏈表表示的圖G進行DFS搜索 給出你的編碼

      //==========BFS:廣度優(yōu)先遍歷========= void BFS(ALGraph *G,int k){ //以Vk為源點對用鄰接鏈表表示的圖G進行廣度優(yōu)先搜索

      給出你的編碼

      //==========主函數(shù)=========== void main(){

      int i;

      ALGraph *G;

      G=(ALGraph *)malloc(sizeof(ALGraph));

      CreatALGraph(G);

      printf(“Print Graph DFS: ”);

      DFS(G);

      printf(“n”);

      printf(“Print Graph BFS: ”);

      BFS(G,3);

      printf(“n”);}

      實驗結果:

      1.鄰接矩陣作為存儲結構

      2.鄰接鏈表作為存儲結構

      心得體會:

      實驗6

      實驗題目:二分查找算法的實現(xiàn)

      實驗目的:

      掌握二分查找法的工作原理及應用過程,利用其工作原理完成實驗題目中的內(nèi)容。

      實驗要求:

      編寫程序構造一個有序表L,從鍵盤接收一個關鍵字key,用二分查找法在L中查找key,若找到則提示查找成功并輸出key所在的位置,否則提示沒有找到信息。

      實驗主要步驟:

      1.建立的初始查找表可以是無序的,如測試的數(shù)據(jù)為{3,7,11,15,17,21,35,42,50}或者{11,21,7,3,15,50,42,35,17}。2.給出算法的遞歸和非遞歸代碼;

      3.如何利用二分查找算法在一個有序表中插入一個元素x,并保持表的有序性?

      程序代碼

      實驗結果:

      心得體會:

      實驗7

      實驗題目:排序

      實驗目的:

      掌握各種排序方法的基本思想、排序過程、算法實現(xiàn),能進行時間和空間性能的分析,根據(jù)實際問題的特點和要求選擇合適的排序方法。

      實驗要求:

      實現(xiàn)直接排序、冒泡、直接選擇、快速、堆、歸并排序算法。比較各種算法的運行速度。

      實驗主要步驟:

      程序代碼

      實驗結果:

      心得體會:

      第五篇:c語言實驗報告

      學號:__________ 姓名:__________ 班級:__________ 日期:__________

      指導教師:__________ 成績:__________

      實驗一 上機操作初步和簡單的C程序設計

      一、實驗目的1、熟悉C語言運行環(huán)境Turbo C++3.02、會簡單的程序調(diào)試

      3、熟悉C語言各種類型數(shù)據(jù)的輸入輸出函數(shù)的使用方法

      4、掌握順序結構程序設計

      二、實驗內(nèi)容

      1、上機運行本章3個例題,熟悉所用系統(tǒng)的上機方法與步驟。(習題1.7)

      2、編寫一個C程序,輸入a、b、c 3個值,輸出其中最大者。(習題1.6)

      3、設圓半徑r=1.5,圓柱高h=3,求圓周長、圓面積、圓球表面積、圓球體積、圓柱體積。用scanf輸入數(shù)據(jù),輸出計算結果,輸出時要求有文字說明,取小數(shù)點后2位數(shù)字。注意:在Trubo C++ 3.0中不能輸入漢字,只能輸入英文或拼音。(習題4.8)

      4、運行如下程序,寫出運行結果。第一┆范文網(wǎng)004km.cn整理該文章,版權歸原作者、原出處所有...#include

      void main()

      {

      int a=1,b=2;

      a=a+b;b=a-b;a=a-b;

      printf(“%d,%dn”,a,b);

      }

      三、實驗步驟與過程

      四、程序調(diào)試記錄

      下載數(shù)據(jù)結構(C語言版)實驗報告格式5則范文word格式文檔
      下載數(shù)據(jù)結構(C語言版)實驗報告格式5則范文.doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻自行上傳,本網(wǎng)站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發(fā)現(xiàn)有涉嫌版權的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進行舉報,并提供相關證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實,本站將立刻刪除涉嫌侵權內(nèi)容。

      相關范文推薦

        C語言 實驗報告

        C語言程序設計(B) (2010-2011-2) 實驗報告 教學班級: 學號: 姓名: 課程教師: 實驗輔導教師: 江西理工大學自由編輯的程序 一、實驗前的源程序: //任意整數(shù)的疊加 #include void main......

        C語言實驗報告

        C語言程序設計(B) (2010-2011-2) 實驗報告 教學班級: 學號: 姓名:課程教師:王華金 實驗輔導教師:王華金 江西理工大學1 P123--五、1、編寫函數(shù),找出5*5數(shù)組對角線上元素的最小值,并在......

        c語言實驗報告

        實驗一 熟悉C語言程序的運行環(huán)境 一、實驗目的 1、了解在該系統(tǒng)上如何編輯、編譯、連接和運行一個C 程序; 2、通過運行簡單的C程序,初步了解C程序的特點。 二、實驗預習1、......

        c語言實驗報告

        南昌大學實驗報告 學生姓名: 學 號: 專業(yè)班級: √ 綜合 □ 設計 □ 創(chuàng)新 實驗日期: 實驗成績: 實驗類型:□ 驗證 □一.實驗名稱 實驗3 控制語句 二.實驗目的 1.熟練掌握if 、if…el......

        c語言實驗報告

        計算機軟件技術基礎實驗報告 實驗一:線性表的排序與查找 一.實驗內(nèi)容 a) 鍵盤輸入一組無序數(shù)據(jù),添加到線性表中; b) 排序線性表并輸出排序結果; c) 鍵盤輸入一個數(shù),并插入到排好......

        C語言實驗報告

        鄭州輕工業(yè)學院 實 踐 報 告 實現(xiàn)內(nèi)容: OJ1123最佳校友(數(shù)組)、OJ1158又是升序(指針)、OJ1180成績統(tǒng)計(結構)、OJ1203做幻方(文件) 學號:541507020140 學生姓名:王紅旭 專業(yè)班級:電子信......

        C語言實驗報告

        實驗一 C程序的運行環(huán)境和方法 一、實驗目的 1.了解所用的計算機系統(tǒng)。 2.了解在該系統(tǒng)上如何進行編輯、編譯、連接和運行一個C程序。 3.通過運行簡單的C程序了解C程序的特點。 二......

        C語言實驗報告

        C語言程序設計(B) (2010-2011-2) 實驗報告2 教學班級: 學號: 姓名:課程教師: 實驗輔導教師: 一、做一個“楊輝三角” 實驗前的源程序: /*楊輝三角*/ #include void fun(int Y[][]......