數據結構c語言第二版課後答案
A. 跪求 清華大學出版社的數據結構(C語音版)(第2版)唐國民 王國鈞 主編的課後習題答案。
1.簡述下列概念:數據、數據元素、數據項、數據對象、數據結構、邏輯結構、存儲結構、抽象數據類型。 
答案: 
數據:是客觀事物的符號表示,指所有能輸入到計算機中並被計算機程序處理的符號的總稱。如數學計算中用到的整數和實數,文本編輯所用到的字元串,多媒體程序處理的圖形、圖像、聲音、動畫等通過特殊編碼定義後的數據。 
數據元素:是數據的基本單位,在計算機中通常作為一個整體進行考慮和處理。在有些情況下,數據元素也稱為元素、結點、記錄等。數據元素用於完整地描述一個對象,如一個學生記錄,樹中棋盤的一個格局(狀態)、圖中的一個頂點等。 
數據項:是組成數據元素的、有獨立含義的、不可分割的最小單位。例如,學生基本信息表中的學號、姓名、性別等都是數據項。 
數據對象:是性質相同的數據元素的集合,是數據的一個子集。例如:整數數據對象是集合N={0,±1,±2,„},字母字元數據對象是集合C={『A』,『B』,„,『Z』, 『a』,『b』,„,『z』},學生基本信息表也可是一個數據對象。 
數據結構:是相互之間存在一種或多種特定關系的數據元素的集合。換句話說,數據結構是帶「結構」的數據元素的集合,「結構」就是指數據元素之間存在的關系。 
邏輯結構:從邏輯關繫上描述數據,它與數據的存儲無關,是獨立於計算機的。因此,數據的邏輯結構可以看作是從具體問題抽象出來的數學模型。 
存儲結構:數據對象在計算機中的存儲表示,也稱為物理結構。 
抽象數據類型:由用戶定義的,表示應用問題的數學模型,以及定義在這個模型上的一組操作的總稱。具體包括三部分:數據對象、數據對象上關系的集合和對數據對象的基本操作的集合。 
2.試舉一個數據結構的例子,敘述其邏輯結構和存儲結構兩方面的含義和相互關系。 
答案: 
例如有一張學生基本信息表,包括學生的學號、姓名、性別、籍貫、專業等。每個學生基本信息記錄對應一個數據元素,學生記錄按順序號排列,形成了學生基本信息記錄的線性序列。對於整個表來說,只有一個開始結點(它的前面無記錄)和一個終端結點(它的後面無記錄),其他的結點則各有一個也只有一個直接前趨和直接後繼。學生記錄之間的這種關系就確定了學生表的邏輯結構,即線性結構。。。完整答案出處
數據結構_c語言版_第2版_唐國民_王國鈞_課後答案_清華大學出版社
http://www.daanjia.com/forum.php?mod=viewthread&tid=100156&fromuid=36878
(出處: 答案家)
B. 數據結構(C語言版)(第2版)嚴蔚敏著的課後習題的題目及答案
是不是這個版本
C. 求《數據結構》(C語言,第二版) 嚴蔚敏、吳偉民主編,清華大學出版社 課後習題答案
http://wenku..com/link?url=-wmTox3c-s9Pk6r0MyGk1N6YqJu-Fya9-LrzhksZfVTfM0R09K9kzLVq9d4_AtX-ZXlPWuZC
D. 請問誰有c語言程序設計(第二版)課後習題答案,譚浩強的
4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765,c1='a',c2='b',想得到以下的輸出格式和結果,請寫出程序(包括定義變數類型和設計輸出)。要求輸出的結果如下:
  a=凵3凵凵b=凵4凵凵c=凵5
  x=1.200000,y=2.400000,z=-3.600000
  x+y=凵3.60凵凵y+z=-1.20凵凵z+x=-2.40
  c1='a'凵or凵97(ASCII)
  c2='B'凵or凵98(ASCII)
解:
#include <stdio.h>
main() 
{ int a,b,c;
   long int u,n;
   float x,y,z;
   char c1,c2;
   a=3;b=4;c=5;
   x=1.2;y=2.4;z=-3.6;
   u=51274;n=128765;
   c1='a';c2='b';
   printf("\n");
   printf("a=%2d b=%2d c=%2d\n",a,b,c);
   printf("x=%8.6f,y=%8.6f,z=%9.6f\n",x,y,z);
   printf("x+y=%5.2f y+z=%5.2f z+x=%5.2f\n",x+y,y+z,z+x);
   printf("u=%6ld n=%9ld\n",u,n);
   printf("c1='%c' or %d(ASCII)\n",c1,c1);
   printf("c2='%c' or %d(ASCII)\n",c2-32,c2);
}
4.5 請寫出下面程序的輸出結果:
#include <stdio.h>
main()
{ int a=5,b=7;
   float x=67.8564,y=-789.124;
   char c='A';
   long n=1234567;
   unsigned u=65535;
   printf("%d%d\n",a,b);
   printf("%3d%3d\n",a,b);
   printf("%f,%f\n",x,y);
   printf("%-10f,%-10f\n",x,y);
   printf("%8.2f,%8.2f,%.4f,%.4f,%3f,%3f\n",x,y,x,y,x,y);
   printf("%e,%10.2e\n",x,y);
   printf("%c,%d,%o,%x\n",c,c,c,c);
   printf("%ld,%lo,%x\n",n,n,n);
   printf("%u,%o,%x,%d\n",u,u,u,u);
   printf("%s,%5.3s\n","COMPUTER","COMPUTER");
}
運行結果:(在TC2.0中)
57
凵凵5凵凵7
67.856400,-789.124023
67.856400凵,-789.124023
凵凵凵67.86,凵-789.12,67.8564,-789.1240,67.856400,-789.124023
6.785640e+Ol,凵凵-7.9e+02
A,65,10l,4l
1234567,4553207,d687
65535,177777,ffff,-1
COMPUTER,凵凵COM
4.6 用下面的scanf函數輸入數據,使a=3,b=7,x=8.5,y=71.82,c1='A',c2='a'。問在鍵盤上如何輸入?
#include <stdio.h>
main()
{ int a,b;
   float x,y;
   char c1,c2;
   scanf("a=%d凵b=%d",&a,&b);
   scanf("%f凵%e",&x,&y);
   scanf("凵%c凵%c",&c1,&c2);
   printf("a=%d,b=%d,x=%f,y=%f,cl=%c,c2=%c\n,a,b,x,y,c1,c2);
}
解:可按如下方式在鍵盤上輸入:
a=3凵b=7↙
8.5凵71.82↙
A凵a↙
輸出為:
a=3,b=7,x=8.500000,y=71.820000,cl=A,c2=a
請注意:在第三個scanf函數雙引號中第一個字元為空格字元。如果沒有這個空格字元,而寫成:
scanf("%c%c,&c1,&c2);
按以上的輸入,輸出就會變成以下兩行:
a=3,b=7,x=8.500000,y=71.820000,cl=
,c2=A
這是因為在輸入完第二行數據後按的回車鍵被作為一個字元送到內存輸入緩沖區中,因此第三個scanf函數中的第一個變數c1讀人了回車符(實際上是回車符的ASCII碼)。第三行輸入的第一個字元A被c2讀取,所以在執行printf函數輸出cl時,就輸出一個回車符,輸出c2時就輸出字元A。我們在程序第三個scanf函數雙引號中第一個字元處放了一個空格字元,這樣第二行末尾輸入的回車符就不會輸入給c1,而是與該空格字元對應,第三行輸入的第一個字元A就被cl讀取。也可以不在scanf函數中加空格,而在第三個函數前加一個getchar函數:getchar(); 用它將前面的回車符「吃掉」。
在一個函數中如果有幾個scanf函數,在輸人數據時往往會出現一些想像不到的情況(例如前面碰到的情況),其中一個重要的原因就是由回車符引起的。C語言很靈活,書上不可能把一切細節都講到,讀者在遇到類似情況時,上機多試驗一下就可以找出規律來。
4.7 用下面的scanf函數輸入數據,使a=10,b=20,c1='A',c2='a',x=1.5,y=-3.75,z=67.8,請問在鍵盤上如何輸入數據?
     scanf("%5d%5d%c%c%f%f%*f,%f",&a,&b,&c1,&c2,&x,&y,&z);
解:
#include <stdio.h>
main()
{
   int a,b;
   float x,y,z;
   char cl,c2;
   scanf("%5d%5d%c%c%f%f%*f,%f",&a,&b,&cl,&c2,&x,&y,&x);
   printf("a=%d,b=%d,c1=%c,c2=%c,x=%6.2f,y=%6.2f,z=%6.2f\n",a,b,c1,c2,x,y,z);
}
運行情況如下:
凵凵凵10凵凵凵20Aa1.5凵-3.75凵1.5,67.8↙  (此行為輸人的數據)
a=10,b=20,cl=A,c2=a,x=凵凵1.50,y=凵-3.75,x=凵67.80  (此行為輸出)
說明:按%5d格式的要求輸入a與b時,要先鍵入三個空格,然後再鍵人10與20。%*f是用來禁止賦值的。在輸入時,對應於%*f的地方,隨意打人了一個數如1.5,該值不會賦給任何變數。
4.8 設圓半徑r=1.5,圓柱高h=3,求圓周長、圓面積、圓球表面積、圓球體積、圓柱體積。用scanf輸入數據,輸出計算結果,輸出時要求有文字說明,取小數點後2位數字。請編程序。
解:
#include <stdio.h>
main()
{ float pi,h,r,l,s,sq,vq,vz;
   pi=3.1415926;
   printf("請輸入圓半徑r,圓柱高h:\n");
   scanf("%f,%f",&r,&h);
   l=2*pi*r;
   s=r*r*pi;
   sq=4*pi*r*r;
   vq=3.0/4.0*pi*r*r*r;
   vz=pi*r*r*h;
   printf("圓周長為:1=%6.2f\n",l);
   printf("圓面積為:s=%6.2f\n",s);
   printf("圓球表面積為:sq=%6.2f\n",sq);
   printf("圓球體積為:sv=%6.2f\n",vq);
   printf("圓柱體積為:sz=%6.2f\n",vz);
}
運行結果:
請輸入圓半徑r,圓柱高h;
1.5,3↙
圓周長為:l= 9.42
圓面積為:s= 7.07
圓球表面積為:sq= 28.27
圓球體積為:sv= 7.95
圓柱體積為:sz= 21.21
4.9 輸入一個華氏溫度,要求輸出攝氏溫度。公式為c=5(F-32)/9,輸出要有文字說明,取2位小數。
解:
#include <stdio.h>
main()
{ float c,f;
   printf("請輸入一個華氏溫度:\n");
   scanf("%f",&f);
   c=(5.0/9.0)*(f-32); /*注意5和9要用實型表示,否則5/9的值為0*/
   printf("攝氏溫度為:%5.2f\n",c);
}
運行結果:
請輸入一個華氏溫度:
78
攝氏溫度為:25.56
4.10 編程序,用getchar函數讀入兩個字元給cl、c2,然後分別用putchar函數和printf函數輸出這兩個字元。並思考以下問題:(1)變數c1、c2應定義為字元型或整型?抑或二者皆可?(2)要求輸出c1和c2值的ASCII碼,應如何處理?用putchar函數還是printf函數?(3)整型變數與字元變數是否在任何情況下都可以互相代替?如char"c1,c2;" 與"int cl,c2;" 是否無條件地等價?
解:
#include <stdio.h>
main()
{ char c1,c2;
   printf("請輸入兩個字元c1,c2:\n");
   c1=getchar();
   c2=getchar();
   printf("用putchar語句輸出結果為:\n");
   putchar(c1);
   putchar(c2);
   printf("\n");
   printf("用printf語句輸出結果為:\n");
   printf("%c,%c\n",c1,c2);
}
運行結果:
請輸入兩個字元c1,c2:
ab↙
用putchar語句輸出結果為:
ab↙
用printf語句輸出結果為:
a,b
請注意連續用兩個getchar函數時怎樣輸入字元。不應當用以下方法輸入:
a↙
b↙
因為第一行將a和回車符輸入到內存的輸入緩沖區,因此c1得到a,c2得到一個回車符。在輸出c2時就會產生一個回車換行,而不會輸出任何可顯示的字元。在實際操作時,只要輸入了"a↙"後,屏幕顯示馬上從用戶屏切換到TC窗口,程序接著執行下去。因為系統認為用戶已輸入了兩個字元,所以我們連續輸入ab兩個字元然後再按回車鍵,就保證了c1和c2分別得到字元a和b。
回答思考問題:
(1) c1和c2可以定義為字元型或整型,二者皆可。
(2) 在printf函數中用%d格式符輸出,即:
     printf("%d,%d\n",c1,c2);
(3) 字元變數在計算機內佔一個位元組,而整型變數占兩個位元組,因此整型變數在可輸出字元的范圍內(ASCII碼為0~255之間的字元)是可以與字元數據互相轉換的。如果整數在此范圍外,則不能代替,請分析以下三個程序。
程序1:(4-10-1.c)
#include <stdio.h>
main()
{ int c1,c2; /*定義為整型*/
   printf("請輸入兩個整數c1,c2:\n");
   scanf("%d,%d",&c1,&c2);
   printf("按字元輸出結果為:\n");
   printf("%c,%c\n",c1,c2);
   printf("按ASCII碼輸出結果為:\n");
   printf("%d,%d\n",c1,c2);
}
運行結果:
請輸入兩個整數c1,c2:
97,98↙
按字元輸出結果為:
a,b
按ASCII碼輸出結果為:
97,98
程序2:(4-10-2.c)
#include <stdio.h>
main()
{ char c1,c2; /* 定義為字元型*/
   int i1,i2; /* 定義為整型 */
   printf("請輸入兩個字元c1,c2:\n");
   scanf("%c,%c",&c1,&c2);
   i1=c1; /* 將字元型賦值給整型變數*/
   i2=c2;
   printf("按字元輸出結果為:\n");
   printf("%c,%c\n",i1,i2); /* 將整型變數按字元輸出*/
   printf("按整數輸出結果為:\n");
   printf("%d,%d\n",c1,c2); /* 將字元變數按整型輸出*/
}
運行結果:
請輸入兩個字元c1,c2:
a,b↙
按字元輸出結果為:
a,b
按整數輸出結果為:
97,98
程序3:(4-10-3.c)
#include <stdio.h>
main()
{ char c1,c2;/* 定義為字元型 */
   char i1,i2;/* 定義為整型 */
   printf("請輸入兩個整數i1,i2:\n");
   scanf("%c,%c",&i1,&i2);
   c1=i1; /* 將整數賦給字元變數 */
   c2=i2;
   printf("按字元輸出結果為:\n");
   printf("%c,%c\n",c1,c2);
   printf("按整數輸出結果為:\n");
   printf("%d,%d\n",c1,c2);
}
運行結果:
請輸入兩個整數i1,i2:
289,330↙
按字元輸出結果為:
!,J
按整數輸出結果為:
33,74
請注意c1和c2是字元變數,只佔一個位元組,只能存放0~255范圍內的整數,而現在輸入給i1和i2的值已超過0~255的范圍,所以只將i1和i2在內存中兩個位元組的低8位賦給c1和c2。可以看到,289-255=33,330-255=74;而與ASCII碼33和74相應的字元為"!"
另外,團IDC網上有許多產品團購,便宜有口碑
E. 數據結構與演算法分析第二版 C語言描述 中文的課後答案 機械工業出版社的~一定要中文的啊~
我個人覺得還是書更好,買個二手書的話便宜又更加實用!!
F. c語言程序設計(第二版)張磊版課後答案
.cpp : Defines the entry point for the console application. 
// 
#include "stdafx.h" 
#include <windows.h> 
#include <stdio.h> 
#include <malloc.h> 
#include <winbase.h> 
#include <process.h> 
void Search() 
{ 
char temp[100]; 
char buffer[2]; 
char result[100]; 
printf("請輸入要查詢的單詞:\n"); 
scanf("%s",&temp); 
buffer[0]=temp[0]; 
buffer[1]='\0'; 
int ret=GetPrivateProfileString(buffer,temp,0,result,100,"./date.ini"); 
if(ret>0) 
printf("%s\n\n\n\n\n",result); 
else 
printf("對不起,沒有您要查找的單詞.\n\n\n\n\n"); 
} 
void InsertItem() 
{ 
char temp[100]; 
char buffer[2]; 
char result[100]; 
printf("請輸入要插入的單詞:\n"); 
scanf("%s",&temp); 
printf("請輸入單詞的解釋:\n"); 
getchar(); 
scanf("%s",&result); 
buffer[0]=temp[0]; 
buffer[1]='\0'; 
int ret=WritePrivateProfileString(buffer,temp,result,"./date.ini"); 
if(ret=0) 
printf("插入失敗。\n\n\n\n\n"); 
else 
printf("插入成功。\n\n\n\n\n"); 
} 
int main(int argc, char* argv[]) 
{ 
int index; 
main: 
printf("**************MENU***************\n\n"); 
printf(" 1 英譯漢\n"); 
// printf("2 漢譯英\n"); 
printf(" 2 插入新的詞條\n"); 
// printf(" 3 刪除已有詞條\n"); 
printf(" 3 清空屏幕\n"); 
printf(" 4 退出\n\n"); 
printf("**********************************\n"); 
do{ 
printf("請選擇操作(1~4):\n"); 
scanf("%d",&index); /*輸入選擇項*/ 
}while(index<0||index>5); /*選擇項不在0~4之間重輸*/ 
switch(index) 
{ 
case 1: 
Search(); 
goto main; 
break; 
case 2: 
InsertItem(); 
goto main; 
break; 
case 3: 
system("cls"); 
goto main; 
break; 
case 4: 
return 0; 
break; 
default: 
break; 
} 
return 0; 
} 
輸出: 
**************MENU*************** 
1 英譯漢 
2 插入新的詞條 
3 清空屏幕 
4 退出 
********************************** 
請選擇操作(1~4): 
1 
請輸入要查詢的單詞: 
bad 
adj. 劣質的,有害的,壞的,不利的,不健康的,嚴重的 
**************MENU*************** 
1 英譯漢 
2 插入新的詞條 
3 清空屏幕 
4 退出 
********************************** 
請選擇操作(1~4): 
2 
請輸入要插入的單詞: 
cat 
請輸入單詞的解釋: 
貓 
插入成功。 
**************MENU*************** 
1 英譯漢 
2 插入新的詞條 
3 清空屏幕 
4 退出 
********************************** 
請選擇操作(1~4): 
1 
請輸入要查詢的單詞: 
cat 
貓 
**************MENU*************** 
1 英譯漢 
2 插入新的詞條 
3 清空屏幕 
4 退出 
********************************** 
請選擇操作(1~4): 
4 
Press any key to continue
滿意請採納。
G. 求數據結構(用面向對象方法與C++語言描述)第二版 殷人昆主編 課後答案
第一章           習題答案
2、××√
3、(1)包含改變數定義的最小范圍
  (2)數據抽象、信息隱蔽
  (3)數據對象、對象間的關系、一組處理數據的操作
  (4)指針類型
  (5)集合結構、線性結構、樹形結構、圖狀結構
  (6)順序存儲、非順序存儲
  (7)一對一、一對多、多對多
  (8)一系列的操作
  (9)有限性、輸入、可行性
4、(1)A(2)C(3)C
5、語句頻度為1+(1+2)+(1+2+3)+…+(1+2+3+…+n)
第二章           習題答案
1、(1)一半,插入、刪除的位置
  (2)順序和鏈式,顯示,隱式
  (3)一定,不一定
  (4)頭指針,頭結點的指針域,其前驅的指針域
2、(1)A(2)A:E、A
             B:H、L、I、E、A
             C:F、M
             D:L、J、A、G或J、A、G
  (3)D(4)D(5)C(6)A、C
3、頭指針:指向整個鏈表首地址的指針,標示著整個單鏈表的開始。
   頭結點:為了操作方便,可以在單鏈表的第一個結點之前附設一個結點,
           該結點的數據域可以存儲一些關於線性表長度的附加信息,也可以什麼都不存。
   首元素結點:線性表中的第一個結點成為首元素結點。
4、演算法如下:
   int Linser(SeqList *L,int X)
   { int i=0,k;
     if(L->last>=MAXSIZE-1)
        { printf(「表已滿無法插入」);
          return(0);
         }
     while(i<=L->last&&L->elem[i]<X)
         i++;
      for(k=L->last;k>=I;k--)
         L->elem[k+1]=L->elem[k];
      L->elem[i]=X;
      L->last++;
      return(1);
     }
5、演算法如下:
#define OK 1
#define ERROR 0
Int LDel(Seqlist *L,int i,int k)
{ int j;
  if(i<1||(i+k)>(L->last+2))
     { printf(「輸入的i,k值不合法」);
       return ERROR;
      }
  if((i+k)==(L->last+2))
     { L->last=i-2;
       ruturn OK;
      }
else
{for(j=i+k-1;j<=L->last;j++)
   elem[j-k]=elem[j];
 L->last=L->last-k;
return OK;
}
}
6、演算法如下:
#define OK 1
#define ERROR 0
Int Delet(LInkList L,int mink,int maxk)
{ Node *p,*q;
  p=L;
  while(p->next!=NULL)
     p=p->next;
  if(mink<maxk||(L->next->data>=mink)||(p->data<=maxk))
    { printf(「參數不合法」);
      return ERROR;
     }
  else
     { p=L;
      while(p->next-data<=mink)
          p=p->next;
      while(q->data<maxk)
         { p->next=q->next;
           free(q);
           q=p->next;
          }
      return OK;
      }
}
9、演算法如下:
int Dele(Node *S)
{ Node *p;
P=s->next;
 If(p= =s)
  {printf(「只有一個結點,不刪除」);
   return 0;
  }
  else
{if((p->next= =s)
   {s->next=s;
free(p);
return 1;
 }
       Else
          { while(p->next->next!=s)
                 P=p->next;
            P->next=s;
            Free(p);
return 1;
}
        }
}
第三章 習題答案
2、(1)
3、棧有順序棧和鏈棧兩種存儲結構。
   在順序棧中,棧頂指針top=-1時,棧為空;棧頂指針top=Stacksize-1時,棧為滿。
   在帶頭結點鏈棧中,棧頂指針top-〉next=NULL,則代表棧空;只要系統有可用空間,鏈棧就不會出現溢出,既沒有棧滿。
5、
#include<seqstack1.h>
#include "stdio.h"
void main( )
{
       char ch,temp;
       SeqStack s;
       InitStack(&s);
       scanf("%c",&ch);
       while(ch!='@'&&ch!='&')
       { 
              Push(&s,ch);
              scanf("%c",&ch);
       }
       while(ch!='@'&&!IsEmpty(&s))
    { 
              Pop(&s,&temp);
              scanf("%c",&ch);
              if(ch!=temp)
                     break;
       }
       if(!IsEmpty(&s))
              printf("no!\n");
       else
       {
              scanf("%c",&ch);
              if(ch=='@') printf("yes!\n");
              else printf("no!\n");
       }
}
12、(1)功能:將棧中元素倒置。
   (2)功能:刪除棧中的e元素。
   (3)功能:將隊列中的元素倒置。   
第四章習題答案
1、StrLength(s)操作結果為14;SubString(sub1,s,1,7)操作結果為sub1=』I AM A 』;
   SubString(sub2,s,7,1)操作結果為sub2=』  』;StrIndex(s,』A』,4) 操作結果為5;
   StrReplace(s,』STUDENT』,q) 操作結果為』I AM A WORKER』;
   StrCat(StrCat(sub1,t), StrCat(sub2,q)) 操作結果為』I AM A GOOD WORKER』;
2、
int StrReplace(SString S,Sstring T,SString V)
{
       int i=1;  //從串S的第一個字元起查找串T
       if(StrEmpty(T))  //T是空串
              return ERROR;
       do
       {
              i=Index(S,T,i);   //結果i為從上一個i之後找到的子串T的位置
              if(i)    //串S中存在串T
              {
                     StrDelete(S,i,StrLength(T));  //刪除該串T
                     StrInsert(S,i,V);       //在原串T的位置插入串V
                     i+=StrLength(V);     //在插入的串V後面繼續查找串T
              }
       }while(i);
       return OK;
}
  
第五章習題答案
1、(1)數組A共佔用48*6=288個位元組;
(2)數組A的最後一個元素的地址為1282;
(3)按行存儲時loc(A36)=1000+[(3-1)*8+6-1]*6=1126
(4)按列存儲時loc(A36)=1000+[(6-1)*6+3-1]*6=1192
9、(1)(a,b)(2)((c,d))(3)(b)(4)b(5)(d)
10、D
 
第六章 習題答案
1、三個結點的樹的形態有兩個;三個結點的二叉樹的不同形態有5個。
2、略
3、證明:分支數=n1+2n2+…+knk         (1)
         n= n0+n1+…+nk                  (2)
                ∵n=分支數+1            (3)
         將(1)(2)代入(3)得
         n0= n2+2n3+3n4+…+(k-1)nk+1
4、
   
 註:C結點作為D的右孩子(畫圖的時候忘記了,不好意思)
5、n0=50,n2=n0-1=49,所以至少有99個結點。
6、(1)前序和後序相同:只有一個結點的二叉樹
  (2)中序和後序相同:只有左子樹的二叉樹
  (3)前序和中序相同:只有右子樹的二叉樹
7、證明:∵n個結點的K叉樹共有nk個鏈域,分支數為n-1(即非空域)。
         ∴空域=nk-(n-1)=nk-n+1
8、對應的樹如下: 
9、(答案不唯一)
哈夫曼樹如下圖所示:
 
哈夫曼編碼如下:
頻率   編碼
0.07   0010
0.19   10
0.02   00000
0.06   0001
0.32   01
0.03   00001
0.21   11
0.10   0011
11、對應的二叉樹如下:
12、求下標分別為i和j的兩個桔點的最近公共祖先結點的值。
typedef  int  ElemType;
void Ancestor(ElemType A[],int n,int i,int j)
{while(i!=j)
  if(i>j) i=i/2;            
  else j=j/2;            
 printf("所查結點的最近公共祖先的下標是%d,值是%d",i,A[i]);
}
15、編寫遞歸演算法,對於二叉樹中每一個元素值為X的結點,刪去以它為根的子樹,並釋放相應的空間。
void Del_Sub(BiTree T)
{ if(T->lchild) Del_Sub(T->lchild);
  if(T->rchild) Del_Sub(T->rchild);
  free(T);
}
void Del_Sub_x(BiTree T,int x)
{ if(T->data==x) Del_Sub(T);
  else
  {if(T->lchild) Del_Sub_x(T->lchild,x);
    if(T->rchild) Del_Sub_x(T->rchild,x);
  }
}
22、
int Width(BiTree bt)
{if (bt==NULL) return (0); 
else
{BiTree p,Q[50];
 int front=1,rear=1,last=1;
 int temp=0, maxw=0;      
 Q[rear]=bt;               
 while(front<=last)
  {p=Q[front++]; temp++;
         if (p->lchild!=NULL)  Q[++rear]=p->lchild;  
   if (p->rchild!=NULL)  Q[++rear]=p->rchild;  
         {last=rear;       
    if(temp>maxw) maxw=temp;
          temp=0;}
}
return (maxw);
}
}
第七章 習題答案
1、(1)頂點1的入度為3,出度為0;
       頂點2的入度為2,出度為2;
       頂點3的入度為1,出度為2;
       頂點4的入度為1,出度為3;
       頂點5的入度為2,出度為1;
       頂點6的入度為2,出度為3;
   (2)鄰接矩陣如下:
        0 0 0 0 0 0
        1 0 0 1 0 0
        0 1 0 0 0 1
        0 0 1 0 1 1
        1 0 0 0 0 0
        1 1 0 0 1 0
(3)鄰接表
(4)逆鄰接表
  
2、答案不唯一
(2)深度優先遍歷該圖所得頂點序列為:1,2,3,4,5,6
                   邊的序列為:(1,2)(2,3)(3,4)(4,5)(5,6)
(3)廣度優先遍歷該圖所得頂點序列為:1,5,6,3,2,4
                   邊的序列為:(1,5)(1,6)(1,3)(1,2)(5,4)
3、
(1)每個事件的最早發生時間:
       ve(0)=0,ve(1)=5,ve(2)=6, ve(3)=12, ve(4)=15, ve(5)=16,
       ve(6)=16, ve(7)=19, ve(8)=21, ve(9)=23
     每個事件的最晚發生時間::
      vl(9)=23, vl(8)=21, vl(7)=19, vl(6)=19, vl(5)=16, vl(4)=15,
      vl(3)=12, vl(2)=6, vl(1)=9, vl(0)=0
(2)每個活動的最早開始時間:
 e(0,1)=0, e(0,2)=0, e(1,3)=5, e(2,3)=6, e(2,4)=6, e(3,4)=12, e(3,5)=12,
e(4,5)=15, e(3,6)=12, e(5,8)=16, e(4,7)=15, e(7,8)=19, e(6,9)=16, e(8,9)=21
     每個活動的最遲開始時間:
 l(0,1)=4, l(0,2)=0, l(1,3)=9, l(2,3)=6, l(2,4)=12, l(3,4)=12, l(3,5)=12, l(4,5)=15, l(3,6)=15, l(5,8)=16, l(4,7)=15,  l(7,8)=19, l(6,9)=19, l(8,9)=21
(3)關鍵路徑如下圖所示:
 
4、頂點1到其餘頂點的最短路經為:
1-〉3最短路經為1,3;長度為15
1-〉2最短路經為1,3,2;長度為19
1-〉5最短路經為1,3,5;長度為25
1-〉4最短路經為1,3,2,4;長度為29
1-〉6最短路經為1,3,2,4,6;長度為44
13、A(7)B(3)C(2)D(11)E(8)
14、略
15、略
第八章 查找
1、畫出對長度為10的有序表進行折半查找的判定樹,並求其等概率時查找成功的平均查找長度。
解:
   ASL=(1+2*2+4*3+3*4)/10=2.9
5、
解:(1)插入完成後的二叉排序樹如下:
 
ASL=(1+2*2+3*3+3*4+2*5+1*6)/12=3.5  ????
(2)ASL=(1+2*2+3*4+4*5)=37/12
(3)
12、
解:哈希表構造如下: 
 0	 1	 2	 3	 4	5 	6 	 7	 8	 9	 10
 22	 	 41	 30	 01	 53	 46	13 	 67	 	 
H(22)=(22*3)%11=0
H(41)=(41*3)%11=2
H(53)=(53*3)%11=5
H(46)=(46*3)%11=6
H(30)=(30*3)%11=2 與(41)沖突
H1(30)=(2+1)%11=3
H(13)=(13*3)%11=6 與46沖突
H1(13)=(6+1)%11=7
H(01)=(01*3)%11=3 與30沖突
H1(01)=(3+1)%11=4
H(67)=(67*3)%11=3 與30沖突
H1(67)=(3+1)%11=4 與01沖突
H2(67)=(3+2)%11=5 與53沖突
H3(67)=(3+3)%11=6 與46沖突
H4(67)=(3+4)%11=7 與13沖突
H5(67)=(3+5)%11=8 
ASLsucc=(1*4+2*3+6)/8=2
ASLunsucc=(2+8+7+6+5+4+3+2)/8=37/8
第九章 排序
1、以關鍵字序列(503,087,512,061,908,170,897,275,653,426)為例,手工執行以下排序演算法,寫出每一趟派結束時的關鍵字狀態。
(1)直接插入排序(2)希爾排序(增量序列為5,3,1)(3)快速排序(4)堆排序(5)歸並排序
解:(1)略
(2)增量為5的排序結果:170,087,275,061,426,503,897,512,653,908
    增量為3的排序結果:061,087,275,170,426,503,897,512,653,908
    增量為1的排序結果:061,087,170,275,426,503,512,653,897,908
(3)一次劃分後:{426 087 275 061 170}503{897 908 653 512}
    分別進行:{170 087 275 061}426 503 {512 653} 897 {908}
              {061 087}170{275}426 503 512 {653} 897 908
               061 087 170 275 426 503 512 653 897 908 
(4)略
7、已知一組關鍵字:(40,27,28,12,15,50,7),要求採用快速排序法從小到大排序。請寫出每趟排序後的劃分結果。
解:初始狀態:40 27 28 12 15 50 7
   一次劃分:{7 27 28 12 15} 40 {50}
   依次劃分:7 {27 28 12 15} 40 50
             7 {15 12} 27 {28} 40 50
             7 12 15 27 28 40 50
16、(1)A3 B1 C4 D2 E7
    (2)C
    (3)C
17、對,錯,對
數據結構課程設計指導書
 一、設計內容 
1.飛機訂票系統(限1 人完成)
【問題描述】
設計一個飛機訂票系統,可以模擬處理飛機訂票過程中的各種操作。
【基本要求】
通過此系統可以實現如下功能:
1)錄入
可以錄入航班情況(數據可以存儲在一個數據文件中,數據結構、具體數據自定)。
2)查詢
可以查詢某個航線的情況(如,輸入航班號,查詢起降時間,起飛抵達城市,航班票價,票價折扣,確定航班是否滿倉);
可以輸入起飛抵達城市,查詢飛機航班情況。
3)訂票(訂票情況可以存在一個數據文件中,結構自己設定)
可以訂票,如果該航班已經無票,可以提供相關可選擇航班。
4)退票
可退票,退票後修改相關數據文件。
客戶資料有姓名,證件號,訂票數量及航班情況,訂單要有編號。
5)修改航班信息
當航班信息改變可以修改航班數據文件
根據以上功能說明,設計航班信息,訂票信息的存儲結構,設計程序完成功能。
2.文章編輯(限1 人完成)
【問題描述】
輸入一頁文字,程序可以統計出文字、數字、空格的個數。
【基本要求】
靜態存儲一頁文章,每行最多不超過80個字元,共N行;
1)分別統計出其中英文字母數和空格數及整篇文章總字數;
2)統計某一字元串在文章中出現的次數,並輸出該次數;
3)刪除某一子串,並將後面的字元前移;
4)用指定的字元串替換某一子串;
5)存儲結構使用線性表,分別用幾個子函數實現相應的功能;
6)輸入數據的形式和范圍:可以輸入大寫、小寫的英文字母、任何數字及標點符號。
7)輸出形式:①分行輸出用戶輸入的各行字元;②分4行輸出"全部字母數"、"數字個數"、"空格個數"、"文章總字數";③輸出刪除某一字元串後的文章;④輸出替換某一字元串後的文章。
3.宿舍管理查詢軟體(限1 人完成)
【問題描述】
為宿舍管理人員編寫一個宿舍管理查詢軟體。
【基本要求】
1) 程序設計要求:
①採用交互工作方式
②建立數據文件,數據文件按關鍵字(姓名、學號、房號)進行排序(冒泡、選擇、插入排序等任選一種)
2) 查詢菜單: (用二分查找實現以下操作)
①按姓名查詢
②按學號查詢
③按房號查詢
3) 輸出任一查詢結果(可以連續操作)
4.全國交通咨詢模擬
【問題描述】
處於不同目的的旅客對交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的時間盡可能的短,出門旅遊的遊客則期望旅費盡可能省,而老年旅客則要求中轉次數最少。編制一個全國城市間的交通咨詢程序,為旅客提供兩種或三種最優決策的交通咨詢。
【設計要求】
1)提供對城市信息進行編輯(如:添加或刪除)的功能。
2)提供對列車時刻表進行編輯(增設或刪除)的功能。
3) 提供兩種最優決策:最快到達和最省錢到達。
4)旅途中耗費的總時間應該包括中轉站的等候時間。
5)咨詢以用戶和計算機的對話方式進行。由用戶輸入起始站、終點站、最優決策原則,輸出信息:最快需要多長時間才能到達或者最少需要多少旅費才能到達,並詳細說明於何時乘坐哪一趟列車到何地。
測試數據:參考教科書7.6節圖7.33的全國交通圖,自行設計列車時刻表。
【實現提示】
1) 對全國城市交通圖和列車時刻表進行編輯,應該提供文件形式輸入和鍵盤輸入兩種方式。列車時刻表則需根據交通圖給出各個路段的詳細信息,例如:基於教科書7.6節圖7.33的交通圖,對從北京到上海的火車,需給出北京至天津、天津至徐州及徐州至上海各段的出發時間、到達時間及票價等信息。
2) 以鄰接表作交通圖的存儲結構,表示邊的結構內除含有鄰接點的信息外,還應包括交通工具、路程中耗費的時間和花費以及出發和到達的時間等多種屬性。
5.哈夫曼編碼/解碼器(限1 人完成)
【問題描述】
設計一個利用哈夫曼演算法的編碼和解碼系統,重復地顯示並處理以下項目,直到選擇退出為止。
【基本要求】
1)      將權值數據存放在數據文件(文件名為data.txt,位於執行程序的當前目錄中)
2)      分別採用動態和靜態存儲結構
3)      初始化:鍵盤輸入字元集大小n、n個字元和n個權值,建立哈夫曼樹;
4)      編碼:利用建好的哈夫曼樹生成哈夫曼編碼;
5)      輸出編碼;
6)      設字元集及頻度如下表:
字元 空格 A B C D E F G H I J K L M
頻度 186 64 13 22 32 103 21 15 47 57 1 5 32 20
字元 N O P Q R S T U V W X Y Z
頻度 57 63 15 1 48 51 80 23 8 18 1 16 1
【進一步完成內容】
1)      解碼功能;
2)      顯示哈夫曼樹;
3)      界面設計的優化。
6.走迷宮游戲
【問題描述】
以一個m×n的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計一個程序,對任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論。
【基本要求】
1.首先用二維數組存儲迷宮數據,迷宮數據由用戶輸入。
2.一個以鏈表作存儲結構的棧類型,然後編寫一個求解迷宮的遞歸或非遞歸程序。求得的通路以三元組(i,j,d)形式輸出,其中:(i,j)指示迷宮中的一個坐標,d表示走到下一坐標的方向(東、南、西、北四個方向所用代表數字,自行定義)。
3.可以用多種方法實現,但至少用兩種方法,用三種以上可加分。
【實現提示】
1.計算機解迷宮問題通常用的是「窮舉求解」方法,即從入口出發,順著某一個方向進行探索,若能走通,則繼續往前進;否則沿著原路退回,換一個方向繼續探索,直至出口位置,求得一條通路。假如所有可能的通路都探索到而未能到達出口,則所設定的迷宮沒有通路。
迷宮的入口點的下標為(1,1),出口點的下標為(m,n)。為處理方便起見,可在迷宮的四周加一圈障礙。對於迷宮的任一位置,均可約定有東、南、西、北四個方向可通。
2.有一種簡單走出迷宮的方法,把手放在右邊的牆上開始前進,始終不要把手從牆上移開。如果迷宮向右拐,你也順著牆向右拐。只要不把手從牆上移開,最終就會到達迷宮的出口。當然這樣得到的路徑可能不是一個最短的路徑,但它可以最終得到結果,換句話說,這種方法走不出迷宮的風險是最小的。
7.作業評分系統
【問題描述】
設計一個可以給小學生出題並且可以給出分數的系統軟體。
【基本要求】
利用棧求表達式的值,可供小學生作業,並能給出分數。
1)    建立試題庫文件,隨機產生n個題目;
2)    題目涉及加減乘除,帶括弧的混合運算;
3)    隨時可以退出;
4)    給出作業分數。
【進一步完成內容】
1)保留歷史分數,能回顧歷史,給出與歷史分數比較後的評價。
2)界面設計的優化。
8.散列表的設計與實現
【問題描述】
設計散列表實現電話號碼查找系統。
【基本要求】
1)設每個記錄有下列數據項:電話號碼、用戶名、地址;
2)從鍵盤輸入各記錄,分別以電話號碼和用戶名為關鍵字建立散列表;
3)採用一定的方法解決沖突;
4)查找並顯示給定電話號碼的記錄;
5)查找並顯示給定用戶名的記錄。
【進一步完成內容】
1)      系統功能的完善;
2)      設計不同的散列函數,比較沖突率;
3)      在散列函數確定的前提下,嘗試各種不同類型處理沖突的方法,考察平均查找長度的變化。
9.停車場管理
【問題描述】
設停車場是一個可停放n輛汽車的狹長通道,且只有一個大門可供汽車進出。汽車在停車場內按車輛到達時間的先後順序,依次由北向南排列(大門在最南端,最先到達的第一輛車停放在車場的最北端),若車場內已停滿n輛汽車,則後來的汽車只能在門外的便道上等待,一旦有車開走,則排在便道上的第一輛車即可開入;當停車場內某輛車要離開時,在它之後進入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其他車輛再按原次序進入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費用。試為停車場編制按上述要求進行管理的模擬程序。
【基本要求】
以棧模擬停車場,以隊列模擬車場外的便道,按照從終端讀入的輸入數據序列進行模擬管理。每一組輸入數據包括三個數據項:汽車「到達」或「離去」信息、汽車牌照號碼以及到達或離去的時刻。對每一組輸入數據進行操作後的輸出信息為:若是車輛到達,則輸出汽車在停車場內或便道上的停車位置;若是車輛離去,則輸出汽車在停車場內停留的時間和應交納的費用(在便道上停留的時間不收費)。棧以順序結構實現,隊列以鏈表結構實現。
【測試數據】
設n=2,輸入數據為:(『A』,1,5),(『A』,2,10),(『D』,1,15),(『A』,3,20),(『A』,4,25),
(『A』,5,30),(『D』,2,35),(『D』,4,40),(『E』,0,0)。其中:『A』表示到達(Arrival);『D』表示(Departure);『E』表示輸入結束(End)。
【實現提示】
需另設一個棧,臨時停放為給要離去的汽車讓路而從停車場退出來的汽車,也用順序存儲結構實現。輸入數據按到達或離去的時刻有序。棧中每個元素表示一輛汽車,包含兩個數據項:汽車的牌照號碼和進入停車場的時刻。
10.八皇後問題
【問題描述】
求出在一個n×n的棋盤上,放置n個不能互相捕捉的國際象棋「皇後」的所有布局。
這是來源於國際象棋的一個問題。皇後可以沿著縱橫和兩條斜線8個方向相互捕捉。如圖所示,一個皇後放在棋盤的第4行第3列位置上,則棋盤上凡打「×」的位置上的皇後就能與這個皇後相互捕捉,也就是下一個皇後不能放的位置。
 
1	2	3	4	5	6	7	8
 	 	×	 	 	×	 	 
×	 	×	 	×	 	 	 
 	×	×	×	 	 	 	 
×	×	Q	×	×	×	×	×
 	×	×	×	 	 	 	 
×	 	×	 	×	 	 	 
 	 	×	 	 	×	 	 
 	 	×	 	 	 	×	 
從圖中可以得到以下啟示:一個合適的解應是在每列、每行上只有一個皇後,且一條斜線上也只有一個皇後。
【實現提示】
求解過程從空配置開始。在第1列至第m列為合理配置的基礎上,再配置第m+1列,直至第n列配置也是合理時,就找到了一個解。接著改變第n列配置,希望獲得下一個解。另外,在任一列上,可能有n種配置。開始時配置在第1行,以後改變時,順次選擇第2行、第3行、…、直到第n行。當第n行配置也找不到一個合理的配置時,就要回溯,去改變前一列的配置。
二、時間安排
2005~2006(一)第19周進行。
第一天: 分析題目,查閱資料;
第二天:演算法設計、編碼;
第三天:編碼、調試運行;
第四天:調試運行,撰寫設計報告;;
第五天:答辯。
三、設計工作要求
1.對學生的要求
(1) 要求學生認真閱讀設計任務書,了解所做的設計內容及要求,認真主動完成課設的要求。有問題及時主動通過各種方式與教師聯系溝通。
(2)學生要發揮自主學習的能力,充分利用時間,安排好課設的時間計劃,並在課設過程中不斷檢測自己的計劃完成情況,及時向教師匯報。
(3)查閱相關的參考文獻;獨立完成設計任務。
(4)認真撰寫課程設計說明書,要求文字通順、有邏輯性、真正反映設計的水平,設計要有創新。
(5)設計完成後上交相關內容要求:
①上交源程序:學生按照課程設計的具體要求所開發的所有源程序(應該放到一個文件夾中)。
②課程設計說明書:到教務處網站下載課程設計報告紙及封面。格式及要求見附錄。
2.對教師的要求
(1)做好設計題目的選題工作,使題目達到一定的綜合性要求,工作量合理;
(2)加強指導,嚴格考勤、考核;
(3)做好答辯、設計報告的評審以及成績評定工作。
附錄:
課程設計說明書,格式及要求如下:
一、封面;
二、目錄;
三、設計任務書;
四、說明書正文,主要內容包括:
1.設計題目;
2.設計目的;
3.演算法思想分析;
4.演算法描述與實現;
5.結論
H. C語言程序設計 第二版 課後答案 (張磊 馮偉昌...
有兩種方式:
第一種:選「文件」,然後選「C/C++ Source File」。
第二種:選「工程」,然後選「Win32 Console Application」,完成後,然後再按第一種方式建立文件。
I. c語言程序設計 現代方法 第二版 課後答案 (美 K.N.king)
if (entity != null) {
final InputStream instream = entity.getContent();
try {
final StringBuilder sb = new StringBuilder();
final char[] tmp = new char[1024];
final Reader reader = new InputStreamReader(instream,encoding);
int l;
while ((l = reader.read(tmp)) != -1) {
sb.append(tmp, 0, l);
}
body = sb.toString();
} finally {
instream.close();
EntityUtils.consume(entity);
}
