版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> *******大學</b></p><p> 《數(shù)據(jù)結構與算法分析》課程設計</p><p> 題 目:數(shù)據(jù)結構上機試題</p><p><b> 學生姓名: </b></p><p><b> 學 號:</b></p&g
2、t;<p> 專 業(yè):信息管理與信息系統(tǒng)</p><p><b> 班 級:</b></p><p><b> 指導教師: </b></p><p><b> 2014年04月</b></p><p><b> 目錄</b&g
3、t;</p><p> 一、順序表的操作2</p><p> 【插入操作原理】2</p><p> 【刪除操作原理】2</p><p> 【NO.1代碼】3</p><p> 【運行截圖演示】7</p><p> 二、單鏈表的操作10</p><p&g
4、t; 【創(chuàng)建操作原理】10</p><p> 【插入操作原理】10</p><p> 【刪除操作原理】10</p><p> 【NO.2代碼】11</p><p> 【運行截圖演示】20</p><p> 三、順序棧的操作25</p><p> 【數(shù)值轉換原理】25&
5、lt;/p><p> 【NO.3代碼】26</p><p> 【運行截圖演示】30</p><p><b> 四、查找算法32</b></p><p> 【順序查找原理】32</p><p> 【折半查找原理】32</p><p> 【NO.4代碼】33
6、</p><p> 【運行截圖演示】38</p><p><b> 五、排序算法40</b></p><p> 【直接插入排序原理】40</p><p> 【快速排序原理】40</p><p> 【NO.5代碼】41</p><p> 【運行截圖演示】
7、46</p><p><b> 一、順序表的操作</b></p><p> ?。?)插入元素操作:將新元素x插入到順序表a中第i個位置;</p><p> ?。?)刪除元素操作:刪除順序表a中第i個元素。</p><p><b> 【插入操作原理】</b></p><p&g
8、t; 線性表的插入操作是指在線性表的第i-1個數(shù)據(jù)元素和第i個數(shù)據(jù)元素之間插入一個新的數(shù)據(jù)元素,就是要是長度為n的線性表:</p><p> 變成長度為n+1的線性表:</p><p> 數(shù)據(jù)元素和之間的邏輯關系發(fā)生了變化。</p><p> ?。ㄆ洹静迦朐怼吭谡n本P23的算法2.3有解釋)</p><p><b> 【刪
9、除操作原理】</b></p><p> 反之,線性表的刪除操作是使長度為n的線性表:</p><p> 變成長度為n-1的線性表:</p><p> 數(shù)據(jù)元素、和之間的邏輯關系發(fā)生變化,為了在存儲結構上放映這個變化,同樣需要移動元素。</p><p> ?。ㄆ洹緞h除原理】在課本P24的算法2.4有解釋)</p>
10、<p><b> 【NO.1代碼】</b></p><p> #include<stdio.h></p><p> #define MAX 100</p><p> typedef int datatype;</p><p> typedef struct</p><
11、p><b> {</b></p><p> datatype data[MAX];</p><p><b> int list;</b></p><p><b> } </b></p><p> sequenlist; /*
12、順序表*/</p><p> int main()</p><p><b> {</b></p><p> int insert( sequenlist *L, int x, int i );</p><p> int deletee( sequenlist *L, int i );</p><
13、;p> int input( sequenlist *L );</p><p> int output( sequenlist *L );</p><p> sequenlist s,*p=&s;</p><p> int indata,inlocate,deletedx;</p><p><b> inpu
14、t(p);</b></p><p> printf( "請輸入要插入的數(shù):" ); </p><p> scanf( "%d",&indata );</p><p> printf( "請輸入要插入的位置:" );</p><p> sc
15、anf( "%d",&inlocate );</p><p> insert( p,indata,inlocate );</p><p> printf( "插入后的數(shù)據(jù):" );</p><p> output(p);</p><p> printf( "請輸入要刪除的位置:
16、" );</p><p> scanf( "%d",&deletedx );</p><p> deletee( p, deletedx );</p><p> printf( "刪除后的數(shù)據(jù):" );</p><p> output(p);</p><p&
17、gt;<b> return 0;</b></p><p><b> }</b></p><p> int output( sequenlist *L ) </p><p><b> {</b></p><p><b> int i;<
18、/b></p><p> for( i=0; i<=L->list; i++ ) </p><p> printf( "%d ",L->data[i] );</p><p> printf( "\n\n" );</p><p> return(1);</p>
19、<p><b> }</b></p><p> int input( sequenlist *L ) </p><p><b> {</b></p><p><b> int i;</b></p><p> printf
20、( "請輸入原始數(shù)據(jù)個數(shù):" );</p><p> scanf( "%d",&( L->list ) );</p><p> L->list--; </p><p> printf( "請輸入原始數(shù)據(jù):" );</p><p> for( i=0; i
21、<= L->list; i++ ) </p><p> scanf( "%d",&( L->data[i] ) );</p><p> printf( "原始數(shù)據(jù)為:" );</p><p> output(L);</p><p> return (1);</p&
22、gt;<p><b> }</b></p><p> int insert( sequenlist *L, int x, int i )</p><p><b> { </b></p><p><b> int j;</b></p><p> if (
23、( (*L).list )>=MAX-1 )</p><p><b> {</b></p><p> printf( "overflow" ); return 0;</p><p><b> }</b></p><p><b> else</b>
24、;</p><p><b> {</b></p><p> if ( (i<1) || (i> ( (*L).list )+1 ) )</p><p><b> {</b></p><p> printf( "error\n" ); </p>&
25、lt;p> return 0;}</p><p><b> else </b></p><p><b> {</b></p><p> for ( j=L->list;j>=i-1;j-- )</p><p> L->data[j+1]=L->data[j];
26、L->data[i-1]=x; L->list++;</p><p><b> }</b></p><p><b> }</b></p><p> return(1);</p><p><b> }</b></p><p> int
27、 deletee( sequenlist *L,int i ) /*定義刪除函數(shù)*/</p><p><b> { </b></p><p><b> int j;</b></p><p> if ( (i<1) || ( i>(L->list)+1 ) )</p><p
28、><b> { </b></p><p> printf( "error\n" );</p><p><b> return 0;</b></p><p><b> } </b></p><p><b> else</b&g
29、t;</p><p><b> { </b></p><p> for ( j=i;j<=L->list;j++ )</p><p> L->data[j-1]=L->data[j];</p><p> L->list--;</p><p><b>
30、 }</b></p><p> return(1);</p><p><b> }</b></p><p><b> 【運行截圖演示】</b></p><p> ?、?、如下面的運行截圖所示,當輸入的線性表長度設置為12的時候,該線性表最多能輸入12位數(shù)的長度。</p>
31、<p> 輸入要插入的數(shù)和插入數(shù)的位置下標,便可以進行插入操作;同理當輸入要執(zhí)行刪除操作數(shù)的位置下標,可以將該數(shù)刪除出線性表。</p><p> ②、如下面的運行截圖所示,當初始設置的線性表長度為5的時候,其5個數(shù)分別是-3、4、5、0、1。</p><p> 若是要執(zhí)行程序中輸入的插入數(shù)字“2”,其插入數(shù)的位置在“-4”的時候,程序是不能執(zhí)行插入操作的。此時的線性表能
32、插入的下標范圍為“1——5”,明顯“-4”數(shù)值<下限“1”數(shù)值,所以程序執(zhí)行“error”。</p><p> ?、邸⑷缦旅娴倪\行截圖所示,同理該線性表要插入數(shù)的位置“6”數(shù)值>上限“5”數(shù)值,所以程序執(zhí)行“error”。</p><p> ④、如下面的運行截圖所示,初始設置的線性表插入數(shù)字2之后,要刪除位置7已超過線性表的最大長度n=6,所以程序執(zhí)行“error”。<
33、/p><p> ⑤、如下面的運行截圖所示,同理該線性表要刪除數(shù)的位置“0”下標不存在,所以程序執(zhí)行“error”。</p><p><b> 二、單鏈表的操作</b></p><p> ?。?)創(chuàng)建一個帶頭結點的單鏈表;</p><p> ?。?)插入元素操作:將新元素x插入到單鏈表中第i個元素之后;</p>
34、<p> ?。?)刪除元素操作:刪除單鏈表中值為x的元素。 </p><p><b> 【創(chuàng)建操作原理】</b></p><p> 在單鏈表的第一個結點之前附設一個結點,稱之為頭結點。頭結點的數(shù)據(jù)域可以不存儲任何信息,也可以存儲線性表的長度等的附加信息,頭結點的指針域存儲指向第一個結點的指針(即第一個元素結點的存儲位置)。</p>&l
35、t;p><b> 【插入操作原理】</b></p><p> 為插入數(shù)據(jù)元素x,首先要生成一個數(shù)據(jù)域為x的結點,然后插入在單鏈表中。根據(jù)插入操作的邏輯定義,還需要修改結點a中的指針域,令其指向結點x,而結點x中的指針域應指向結點b,從而實現(xiàn)3個元素a、b和x之間邏輯關系的變化。</p><p> 假設s為指向結點x的指針,則上述指針修改用語描述即為:<
36、;/p><p><b> 【刪除操作原理】</b></p><p> 反之,在線性表中刪除元素b時,為在單鏈表中實現(xiàn)元素a、b和c之間邏輯關系的變化,僅需要修改結點a中的指針域即可。</p><p> 假設p為指向結點a的指針,則上述指針修改用語描述即為:</p><p><b> 【NO.2代碼】<
37、/b></p><p> #include<stdio.h></p><p> #include<malloc.h></p><p> typedef struct node //定義鏈表</p><p><b> { </b></p><p><b&g
38、t; int data;</b></p><p> struct node *next;</p><p><b> }</b></p><p><b> snode;</b></p><p> snode* creat() //創(chuàng)建鏈表的函數(shù)</p><p&
39、gt;<b> { </b></p><p> snode *head, *p, *q;</p><p> head = (snode *)malloc(sizeof(snode));</p><p><b> p = head;</b></p><p><b> int x;&
40、lt;/b></p><p> printf("請輸入創(chuàng)建鏈表的值,用“0”結束輸入。\n");</p><p> printf("x = ");</p><p> scanf("%d", &x);</p><p> while (x != 0)</p&g
41、t;<p><b> {</b></p><p> q = (snode *)malloc(sizeof(snode));</p><p> q->data = x;</p><p> p->next = q;</p><p><b> p = q;</b><
42、;/p><p> printf("x = ");</p><p> scanf("%d", &x);</p><p><b> }</b></p><p> p->next = NULL; </p><p> return head;
43、</p><p><b> }</b></p><p> int length(snode *head)//測鏈表的結點數(shù)</p><p><b> {</b></p><p> int i = 0;</p><p> snode *p = head->nex
44、t;</p><p> while (p != NULL)</p><p><b> {</b></p><p> p = p->next;</p><p><b> i++;</b></p><p><b> } </b></p
45、><p><b> return i;</b></p><p><b> }</b></p><p> void display(snode *head) </p><p><b> {</b></p><p> snode *p = head-&
46、gt;next;</p><p> for(int i = 0; i < length(head); i++)</p><p><b> {</b></p><p> printf("%4d", p->data);</p><p> p = p->next;</p>
47、;<p><b> }</b></p><p> printf(" ");</p><p><b> }</b></p><p> int locate(snode *head, int x) </p><p><b> {</b>&
48、lt;/p><p> snode *p = head->next;</p><p> int i = 1;</p><p> while (p != NULL && x != p->data)</p><p><b> {</b></p><p> p = p-&
49、gt;next;</p><p><b> i++;</b></p><p><b> }</b></p><p> if (p == NULL) </p><p><b> return 0;</b></p><p><b>
50、 else </b></p><p><b> return i;</b></p><p><b> }</b></p><p> int insnode(snode *head, int x, int i) //把x插入到鏈表的第i的位置</p><p><b>
51、; { </b></p><p><b> int j;</b></p><p> snode *p = head->next, *s;</p><p> if(i < 1 || i > (length(head) + 1))</p><p><b> retu
52、rn 0;</b></p><p> else if (i == 1)</p><p><b> { </b></p><p> s = (snode *)malloc(sizeof(snode)); </p><p> s->next = p; </p><p&
53、gt; head->next = s; </p><p> s->data = x;</p><p><b> }</b></p><p><b> else</b></p><p><b> { </b></p><p>
54、 for (j = 1; j < i - 1; j++) </p><p> p = p->next;</p><p> s = (snode *)malloc(sizeof(snode));</p><p> s->next = p->next;</p><p> p->next = s;</
55、p><p> s->data = x; </p><p><b> }</b></p><p><b> return 1;</b></p><p><b> }</b></p><p> int delnode(snode *head, i
56、nt i)//刪除鏈表中第i個結點</p><p><b> {</b></p><p> snode *p = head->next, *q = head;</p><p> if(i < 1 || i > length(head))</p><p><b> return 0;&l
57、t;/b></p><p> else if (i == 1)</p><p><b> { </b></p><p> head->next = p->next;</p><p><b> free(p);</b></p><p><b&g
58、t; } </b></p><p><b> else</b></p><p><b> { </b></p><p> for (int j = 1; j < i; j++)</p><p><b> {</b></p>
59、<p> p = p->next; q = q->next;</p><p><b> }</b></p><p> q->next = p->next;</p><p> free(p); </p><p><b> }</b></p&g
60、t;<p><b> return 1;</b></p><p><b> }</b></p><p> void sort(snode *head) //把鏈表中每個結點的值按從小到大排列</p><p><b> {</b></p><p> sno
61、de *p, *q;</p><p><b> int k;</b></p><p> for(p = head->next; p != NULL; p = p->next)</p><p> for(q = p->next; q != NULL; q = q->next)</p><p>
62、 if (p->data > q->data)</p><p><b> { </b></p><p> k = p->data; </p><p> p->data = q->data; </p><p> q->data = k; <
63、;/p><p><b> }</b></p><p><b> }</b></p><p> void insert(snode *head, int x) //在有序鏈表中插入x,插入后仍保持有序</p><p><b> { </b></p><
64、;p> snode *p = head->next, *s, *q = head;</p><p> while (p != NULL && p->data < x)</p><p><b> { </b></p><p> q = q->next;</p><
65、;p> p = p->next;</p><p><b> }</b></p><p> s = (snode *)malloc(sizeof(snode));</p><p> s->next = q->next; </p><p> s->data = x; <
66、;/p><p> q->next = s;</p><p><b> }</b></p><p> void del_min_max(snode *head, int min, int max) //刪除有序鏈表中值min到值max中的結點</p><p><b> {</b></p
67、><p> snode *p = head->next, *q = head;</p><p> while (p != NULL && p->data <= min)</p><p><b> {</b></p><p><b> q = p;</b><
68、/p><p> p = p->next; </p><p><b> }</b></p><p> while (p != NULL && p->data < max)</p><p><b> { </b></p><p> q-
69、>next = p->next;</p><p><b> free(p);</b></p><p> p = q->next;</p><p><b> }</b></p><p><b> }</b></p><p> v
70、oid del_min(snode *head) </p><p><b> {</b></p><p> snode *p = head->next, *q = head;</p><p> snode *p_min, *q_min;</p><p> p_min = p;</p><
71、p> q_min = q;</p><p> while (p != NULL)</p><p><b> {</b></p><p> q = p; p = p->next;</p><p> if (p != NULL && p->data < p_min->
72、;data)</p><p><b> {</b></p><p> q_min = p_min;</p><p> p_min = p;</p><p><b> }</b></p><p><b> }</b></p><
73、;p> q_min->next = p_min->next;</p><p> free(p_min);</p><p><b> }</b></p><p> int main()</p><p><b> { </b></p><p>
74、 int min, max;</p><p> snode *headl = creat(); //創(chuàng)建鏈表</p><p> printf("最初的鏈表如下:");</p><p> display(headl);</p><p> printf("\n\n");</p><
75、;p> int num, location;</p><p> printf("請輸入您要查找的數(shù):");</p><p> scanf("%d", &num);</p><p> if (locate(headl, num))</p><p> printf("數(shù)字%
76、d在鏈表中的位置為:%d\n\n", num, locate(headl, num));</p><p><b> else</b></p><p> printf("數(shù)字%d在鏈表中不存在!\n\n", num);</p><p> printf("請分別輸入您要插入到鏈表中的數(shù)以及想插入的位置(
77、用空格號間隔開):");</p><p> scanf("%d %d", &num, &location);</p><p> if (insnode(headl, num, location))</p><p><b> { </b></p><p> p
78、rintf("插入新值以后的鏈表如下:");</p><p> display(headl);</p><p> printf("\n\n");</p><p><b> } </b></p><p> else printf("輸入有誤!\n\n"
79、;);</p><p> printf("請輸入您想刪除的結點位置:");</p><p> scanf("%d", &location);</p><p> if (delnode(headl, location))</p><p><b> { </b>
80、;</p><p> printf("刪除第%d個結點后的鏈表如下:", location);</p><p> display(headl);</p><p> printf("\n\n");</p><p><b> } </b></p><p
81、><b> else</b></p><p> printf("輸入有誤! \n\n");</p><p><b> }</b></p><p><b> 【運行截圖演示】</b></p><p> ?、佟⑷缦旅娴倪\行截圖所示,創(chuàng)建帶有頭結點且
82、長度為8的單鏈表:4、8、2、-4、-6、1、9、-1。</p><p> 輸入要查詢的數(shù)“-6”,則查詢到單鏈表中數(shù)“-6”的存儲位置為“5”的下標號。</p><p> 輸入要插入的數(shù)和插入數(shù)的位置下標,便可以進行插入操作。程序中要求插入的數(shù)是“3”,插入數(shù)的位置下標為“5”,兩者之間用空格號隔開,則插入后的新單鏈表為:4、8、2、-4、3、-6、1、9、-1。</p>
83、<p> 同理當輸入要執(zhí)行刪除操作的數(shù)位置下標,可以對該數(shù)刪除出線性表。程序中要求刪除的數(shù)下標是7,則執(zhí)行該刪除操作之后的新單鏈表為:4、8、2、-4、3、-6、9、-1。</p><p> ?、?、如下面的運行截圖所示,創(chuàng)建帶有頭結點且長度為8的單鏈表,要查詢的數(shù)“3”不在該單鏈表中,所以程序執(zhí)行“error”。</p><p> ?、?、如下面的運行截圖所示,創(chuàng)建帶頭結點且
84、長度為8的單鏈表,要插入數(shù)的位置下標“-1”不在該單鏈表中,所以程序執(zhí)行“error”。</p><p> ?、?、如下面的運行截圖所示,創(chuàng)建帶頭結點且長度為8的單鏈表,要插入的位置下標“9”為單鏈表最大長度,所以程序執(zhí)行插入操作。</p><p> ?、?、如下面的運行截圖所示,創(chuàng)建帶頭結點且長度為8的單鏈表,要插入的位置下標“10”超出單鏈表長度,所以程序不執(zhí)行插入操作。</p>
85、;<p> ?、?、如下面的運行截圖所示,創(chuàng)建帶頭結點且長度為8的單鏈表,要刪除數(shù)的位置下標“-2”不在該單鏈表中,所以程序執(zhí)行“error”。</p><p> ?、?、如下面的運行截圖所示,創(chuàng)建帶頭結點且長度為8的單鏈表,要刪除數(shù)的位置下標“10”超出單鏈表長度,所以程序執(zhí)行“error”。</p><p><b> 三、順序棧的操作</b></
86、p><p> 在順序棧上實現(xiàn)將非負十進制數(shù)轉換成二進制數(shù)。</p><p><b> 【數(shù)值轉換原理】</b></p><p> 十進制數(shù)N和其他d進制數(shù)的轉換時計算機實現(xiàn)計算的基本問題,其解決方法很多,其中一個簡單算法基于下列原理:</p><p> ?。ㄆ渲校篸iv為整除運算,mod為求余運算)</p>
87、<p> 假設現(xiàn)在要編制一個滿足下列要求的程序:對于輸入的任意一個非負十進制整數(shù),打印輸出與其等值的二進制數(shù)。</p><p> 由于上述計算過程是從低位到高位順序產生二進制數(shù)的各個數(shù)位,而打印輸出,一般來說應從高位到低位進行,恰好和計算過程相反。因此,若將計算過程中得到的二進制數(shù)的各位順序進棧,則按出棧序列打印輸出的即為輸入對應的二進制數(shù)。</p><p> ?。ㄆ洹緮?shù)
88、值轉換】在課本P48的算法3.2有解釋)</p><p><b> 【NO.3代碼】</b></p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #define MaxSize 50</p>&l
89、t;p> typedef char ElemType;</p><p> char digit[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";</p><p> typedef struct</p><p><b> {</b></p><p>
90、 ElemType data[MaxSize];</p><p><b> int top;</b></p><p><b> }</b></p><p><b> SqStack;</b></p><p> void InitStack(SqStack *&s
91、)</p><p><b> {</b></p><p> s = (SqStack *)malloc(sizeof(SqStack));</p><p> s -> top = -1;</p><p><b> }</b></p><p> int Push
92、(SqStack *&s, ElemType e)</p><p><b> {</b></p><p> if(s -> top == MaxSize - 1)</p><p><b> return 0;</b></p><p> s -> top++;</p&
93、gt;<p> s -> data[s -> top] = e;</p><p><b> return 1;</b></p><p><b> }</b></p><p> int Pop(SqStack *&s, ElemType &e)</p><
94、p><b> {</b></p><p> if(s -> top == -1)</p><p><b> return 0;</b></p><p> e = s -> data[s -> top];</p><p> s -> top--;return
95、1;</p><p><b> }</b></p><p> int GetTop(SqStack *s, ElemType &e)</p><p><b> {</b></p><p> if(s -> top == -1)</p><p><
96、b> return 0;</b></p><p> e = s -> data[s -> top];</p><p><b> return 1;</b></p><p><b> }</b></p><p> void DispStack(SqStack *
97、s)</p><p><b> { </b></p><p><b> int i;</b></p><p> for(i = s -> top; i >= 0; i--) </p><p> printf("%c", s -> data[i]);&
98、lt;/p><p> printf("\n");</p><p><b> }</b></p><p> int fun(SqStack *s,int num, int k) //可將十進制轉換成任意進制</p><p><b> {</b></p><p
99、> static int count = 0;</p><p><b> int n;</b></p><p> if(num < k)</p><p><b> {</b></p><p> Push(s, digit[num]);</p><p>
100、 return count;</p><p><b> }</b></p><p> n = num % k;</p><p> Push(s, digit[n]);</p><p> fun(s,num/k, k);</p><p><b> }</b></
101、p><p> int main()</p><p><b> {</b></p><p> SqStack *t;</p><p><b> int i;</b></p><p> InitStack(t);</p><p> printf(&
102、quot;請輸入一個非負十進制數(shù):");</p><p> scanf("%d", &i);</p><p> fun(t, i, 2); </p><p> printf("其二進制數(shù)為:");</p><p> DispStack(t);</p><p
103、><b> free(t);</b></p><p><b> return 0;</b></p><p><b> }</b></p><p><b> 【運行截圖演示】</b></p><p> ?、?、如下面的運行截圖所示,輸入非負十進制
104、整數(shù)“14”,經過數(shù)值轉換之后的二進制數(shù)為“1110”。</p><p> ?、?、如下面的運行截圖所示,輸入十進制整數(shù)“-2”,由于“-2”為負數(shù),所以無法經過數(shù)值轉換為二進制數(shù)。</p><p> ③、如下面的運行截圖所示,輸入非負十進制整數(shù)“0”,經過數(shù)值轉換之后的二進制數(shù)為“0”。</p><p><b> 四、查找算法</b><
105、;/p><p> 在順序表中采用順序查找算法和折半查找算法尋找關鍵字X在順序表中的位置。</p><p><b> 【順序查找原理】</b></p><p> 從表中最后一個記錄開始,逐個進行記錄的關鍵字和給定值的比較,若某個記錄的關鍵字和給定值比較相等,則查找成功,找到所查記錄;反之,若直至第一個記錄,其關鍵字和給定值比較都不等,則表明表中
106、沒有所查記錄,查找不成功。</p><p> 在等概率情況下順序查找的平均長度為:</p><p><b> 【折半查找原理】</b></p><p> 先確定待查記錄所在的范圍(區(qū)間),然后逐步縮小范圍直到找到或找不到該記錄為止。</p><p> 折半查找過程是以處于區(qū)間中間位置記錄的關鍵字和給定值比較,若相
107、等,則查找成功,若不等,則縮小范圍,直至新的區(qū)間中間位置記錄的關鍵字等于給定值或者查找區(qū)間的大小小于零時(表明查找不成功)為止。</p><p> 假設表中每個記錄的查找概率相等,則查找成功時折半查找的平均查找長度:</p><p><b> 【NO.4代碼】</b></p><p> #include <stdio.h>&l
108、t;/p><p> #include <math.h></p><p> #define MAXL 1000</p><p> #define INF 32767</p><p> int process[MAXL],pn;</p><p> //順序表的存儲結構</p><p&g
109、t; typedef int KeyType;</p><p> typedef int InfoType;</p><p> typedef struct</p><p><b> { </b></p><p> KeyType key;</p><p> InfoType d
110、ata;</p><p><b> } </b></p><p><b> NodeType;</b></p><p> typedef NodeType SeqList[MAXL];</p><p> //索引表的存儲結構</p><p> typedef str
111、uct</p><p><b> { </b></p><p> KeyType key;</p><p><b> int link;</b></p><p><b> } </b></p><p><b> IdxType;
112、</b></p><p> typedef IdxType IDX[MAXL];</p><p><b> //順序查找算法</b></p><p> int SeqSearch(SeqList R,int n,KeyType k)</p><p><b> {</b></
113、p><p><b> int i=0;</b></p><p><b> pn=0;</b></p><p> while(i<n&&R[i].key!=k)</p><p><b> { </b></p><p>
114、process[pn++]=R[i].key;</p><p><b> i++;</b></p><p><b> } </b></p><p> if(i>=n) return -1;</p><p> else return i;</p><p>&l
115、t;b> } </b></p><p><b> //折半查找算法</b></p><p> int BinSearch(SeqList R,int n,KeyType k)</p><p><b> { </b></p><p> int low=0,hig
116、h=n-1,mid;</p><p><b> pn=0;</b></p><p> while(low<=high)</p><p><b> {</b></p><p> mid=(low+high)/2;</p><p> if(R[mid].key==
117、k) return mid;</p><p> if(R[mid].key>k)</p><p><b> {</b></p><p> process[pn++]=R[mid].key;</p><p> high=mid-1;</p><p> } </p
118、><p><b> else</b></p><p> { </p><p> process[pn++]=R[mid].key;</p><p> low=mid+1;</p><p><b> } </b></p><p>
119、;<b> } </b></p><p> return -1;</p><p><b> } </b></p><p> int main()</p><p><b> { </b></p><p> int n,i,k,m;&l
120、t;/p><p> SeqList R;</p><p><b> IDX I;</b></p><p> printf("(1)請輸入有/無序順序表的元素個數(shù):\n");</p><p> while(scanf("%d",&n)!=EOF)</p>&
121、lt;p><b> {</b></p><p> printf("請輸入有/無序順序表的%d個元素:\n",n);</p><p> for(i=0;i<n;i++) </p><p> scanf("%d",&R[i].key);</p><p>
122、printf("請輸入要查找的關鍵字:\n");</p><p> scanf("%d",&k);</p><p> printf("使用順序查找算法,");</p><p> if(SeqSearch(R,n,k)!=-1)</p><p><b> {&
123、lt;/b></p><p> printf("關鍵字%d的下標為:\n%d\t\n查找過程為:\n",k,SeqSearch(R,n,k));</p><p> for(i=0;i<pn;i++) printf("%d ",process[i]);</p><p> printf("%d\n\n&
124、quot;,k);</p><p><b> }</b></p><p> else printf("要查找的關鍵字%d不在無序順序表中\(zhòng)n\n",k);</p><p> printf("(2)請輸入有序順序表的元素個數(shù):\n");//10</p><p> scanf(
125、"%d",&n);</p><p> printf("請輸入有序順序表的%d個元素:\n",n);</p><p> for(i=0;i<n;i++) </p><p> scanf("%d",&R[i].key);</p><p> printf(&q
126、uot;請輸入要查找的關鍵字:\n");</p><p> scanf("%d",&k);</p><p> printf("使用折半查找算法,");</p><p> if(BinSearch(R,n,k)!=-1)</p><p><b> {</b>
127、</p><p> printf("關鍵字%d的下標為:\n%d\t\n查找過程為:\n",k,BinSearch(R,n,k));</p><p> for(i=0;i<pn;i++) </p><p> printf("%d ",process[i]);</p><p> printf
128、("%d\n\n",k);</p><p><b> }</b></p><p> else printf("要查找的關鍵字%d不在有序順序表中\(zhòng)n\n",k);</p><p><b> return 0;</b></p><p><b>
129、 }</b></p><p><b> }</b></p><p><b> 【運行截圖演示】</b></p><p> ?、?、如下面的運行截圖所示,使用順序查詢算法和折半查找算法,查找數(shù)“5”,其查找過程分別為:-3、5、8、9、-2、-1;3、-2、-1。</p><p> ?、?/p>
130、、如下面的運行截圖所示,在無序順序表中使用順序查詢算法,查找數(shù)“6”,因數(shù)“6”位置下標超過表最大長度,即程序查找不到。</p><p> ?、?、如下面的運行截圖所示,在無序順序表中使用順序查詢算法,查找數(shù)“1”,因為數(shù)“1”不在該表中,所以程序查找不到數(shù)“1”。</p><p> ?、堋⑷缦旅娴倪\行截圖所示,在有序順序表中使用折半查詢算法,查找數(shù)“1”,因為數(shù)“1”不在該表中,所以程序查
131、找不到數(shù)“1”。</p><p><b> 五、排序算法</b></p><p> 將無序數(shù)列使用直接插入排序算法和快速排序算法將其排成遞增有序數(shù)列。</p><p> 【直接插入排序原理】</p><p> 是一種最簡單的排序方法,它的基本操作是將一個記錄插入到已排好序的有序表中,從而得到一個新的、記錄數(shù)增1的
132、有序表。</p><p> 排序的基本操作為:比較兩個關鍵字的大小和移動記錄。先分析一趟插入排序的情況。For循環(huán)的次數(shù)取決于待插記錄的關鍵字與前i-1個記錄的關鍵字之間的關系。則在整個排序過程(進行n-1趟插入排序)中,當待排序列中記錄按關鍵字非遞減有序排列,所需進行關鍵字間比較的次數(shù)達最小值n-1,記錄不需移動;反之,當待排序列中記錄按關鍵字非遞增有序排列是,總的比較次數(shù)達到最大值,記錄移動的次數(shù)也達最大值
133、。若待排序記錄是隨機的,即待排序列中的記錄可能出現(xiàn)的各種排列的概率相同,則我們可取上述最小值和最大值的平均值,作為直接插入排序時所需進行關鍵字間的比較次數(shù)和移動記錄的次數(shù)。</p><p><b> 【快速排序原理】</b></p><p> 快速排序是對起泡排序的一種改進。它的基本思想是,通過一趟排序將待排序記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一
134、部分記錄的關鍵字小,則可分別對這兩部分記錄繼續(xù)進行排序,以達到整個序列有序。</p><p><b> 【NO.5代碼】</b></p><p> #include<iostream.h></p><p> #include<stdlib.h></p><p> #define MAX 1
135、00</p><p> //將無序數(shù)列使用直接插入排序算法和快速排序算法將其排成遞增有序數(shù)列</p><p> typedef struct </p><p><b> {</b></p><p> int data[MAX];</p><p> int length;</p>
136、;<p><b> }</b></p><p><b> sqlist;</b></p><p> void init(sqlist &a)//線性表初始化</p><p><b> {</b></p><p> a.length=0;</
137、p><p><b> }</b></p><p> void insert(sqlist &a ,int i,int x)// 插入元素,構造無序數(shù)列</p><p><b> {</b></p><p><b> int j;</b></p><
138、;p> if(i<0||i>a.length+1||a.length==100);</p><p><b> else</b></p><p><b> {</b></p><p> for(j=a.length+1;j>i;j--)</p><p> a.data
139、[j]=a.data[j-1];</p><p> a.data[j]=x;</p><p> a.length++;</p><p><b> }</b></p><p><b> } </b></p><p> //放在a.data[n]中,被排序的記錄放在a.
140、data[0..n-1]中,直接插入排序算法。</p><p> void insertsort(sqlist &a)//直接插入排序算法</p><p><b> {</b></p><p><b> int i,j;</b></p><p> int n=a.length;<
141、;/p><p> for(i=n-2;i>=0;i--) </p><p> if(a.data[i]>a.data[i+1]) </p><p><b> { </b></p><p> a.data[n]=a.data[i];//a.data[n]是哨兵</p><p><
142、;b> j=i+1; </b></p><p><b> do</b></p><p><b> { </b></p><p> a.data[j-1]=a.data[j]; </p><p><b> j++;</b></p><
143、;p><b> }</b></p><p> while(a.data[j]<a.data[n]);</p><p> a.data[j-1]=a.data[n];</p><p><b> }</b></p><p><b> }</b></p&
144、gt;<p> int Partition(sqlist &a,int i,int j)</p><p><b> {</b></p><p> int pivot=a.data[i];</p><p> while(i<j)</p><p><b> {</b>
145、;</p><p> while(i<j&&a.data[j]>=pivot) </p><p><b> j--; </b></p><p><b> if(i<j) </b></p><p> a.data[i++]=a.data[j]; </p&
146、gt;<p> while(i<j&&a.data[i]<=pivot) </p><p><b> i++; </b></p><p><b> if(i<j) </b></p><p> a.data[j--]=a.data[i]; </p><
147、;p><b> } </b></p><p> a.data[i]=pivot; </p><p><b> return i;</b></p><p><b> }</b></p><p> void QuickSort(sqlist &a,int l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結構順序表課程設計
- 數(shù)據(jù)結構實驗1順序表-鏈表
- 數(shù)據(jù)結構順序表課程設計--順序表基本實現(xiàn)和存儲結構
- 數(shù)據(jù)結構課程設計--排序算法
- 數(shù)據(jù)結構-順序表的查找插入與刪除
- 數(shù)據(jù)結構課程設計---排序算法比較
- 拓撲排序(算法與數(shù)據(jù)結構課程設計)
- 數(shù)據(jù)結構課程設計--排序算法比較
- 數(shù)據(jù)結構課程設計----內部排序算法性能分析
- 數(shù)據(jù)結構課程設計-- 循環(huán)單鏈表
- 數(shù)據(jù)結構課程設計--排序算法演示系統(tǒng)
- 數(shù)據(jù)結構課程設計---排序算法的實現(xiàn)
- 數(shù)據(jù)結構課程設計報告內部排序的算法設計與分析
- (數(shù)據(jù)結構c語言版)順序表和單鏈表的逆置
- 大數(shù)據(jù)結構課程設計排序算法演示系統(tǒng)
- 數(shù)據(jù)結構課程設計報告--內部排序算法的性能分析
- 數(shù)據(jù)結構與算法分析課程設計
- 數(shù)據(jù)結構課程設計--內部排序算法的比較
- 數(shù)據(jù)結構課程設計--幾種排序算法的演示
- 數(shù)據(jù)結構與算法查找
評論
0/150
提交評論