數(shù)據(jù)結(jié)構(gòu)教程習(xí)題答案 李蓉蓉 安楊等編著第三版 第六章答案
《數(shù)據(jù)結(jié)構(gòu)教程習(xí)題答案 李蓉蓉 安楊等編著第三版 第六章答案》由會(huì)員分享,可在線閱讀,更多相關(guān)《數(shù)據(jù)結(jié)構(gòu)教程習(xí)題答案 李蓉蓉 安楊等編著第三版 第六章答案(16頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、6.1
/*********************************************
題目:已知A[n]為整數(shù)數(shù)組,編寫一個(gè)遞歸算法求n個(gè)元素的平均值
設(shè)計(jì):狼影
時(shí)間;2012.10.1
*****************************************************/
# include
2、
float average;
int a[size];
//輸入數(shù)據(jù)的個(gè)數(shù)
printf("輸入數(shù)據(jù)的個(gè)數(shù)\n");
scanf("%d", &n);
//輸入n個(gè)數(shù)據(jù)
printf("輸入數(shù)據(jù)\n");
for(i = 0; i 3、 if(i>=n)
return (sum/n);
else
{
sum += a[i];
return (cal_average(a, i+1, n));
}
}
/***************************************
輸入數(shù)據(jù)的個(gè)數(shù)
5
輸入數(shù)據(jù)
1 2 3 4 5
平均數(shù)數(shù)3.000000
Press any key to continue
**********************************************/
6.2
/***************************** 4、**
題目;有一個(gè)不帶表頭結(jié)點(diǎn)的單鏈表,設(shè)計(jì)如下的遞歸算法:(下面的代碼實(shí)現(xiàn)的順序?yàn)榱朔奖憧赡芘c問題的順序不一致)
1.求以h為頭指針的單鏈表的節(jié)點(diǎn)的個(gè)數(shù)
2.正向顯示以h為頭指針的單鏈表的所有節(jié)點(diǎn)值
3.反向顯示以h為頭指針的單鏈表的所有節(jié)點(diǎn)值
4.刪除以h為頭指針的單鏈表中值為x的第一個(gè)節(jié)點(diǎn)
5.刪除以h為頭指針的單鏈表中值為x的所有節(jié)點(diǎn)
6.輸出以h為頭指針的單鏈表中最大節(jié)點(diǎn)值
7.輸出以h為頭指針的單鏈表中最小節(jié)點(diǎn)值
設(shè)計(jì);狼影
時(shí)間:2012.10.1
********************************************** 5、**/
# include 6、ad);
int cal_max(NODE *pHead);
int cal_min(NODE *pHead);
NODE *delete_x(NODE *pHead, int x);
NODE *delete_all_x(NODE *pHead, int x);
main()
{
NODE *pHead;
int max, min;
int number, x;
int sert;
//首先先創(chuàng)建一個(gè)鏈表
printf("輸入數(shù)據(jù)按0結(jié)束\n");
pHead = creat_list();
if(pHead!=NULL)
{
/ 7、/下面正向輸出內(nèi)容
printf("正向輸出的結(jié)果是\n");
front_output(pHead);
printf("\n");
//反向輸出鏈表內(nèi)容
printf("反向輸出的結(jié)果是\n");
back_output(pHead);
printf("\n");
//求節(jié)點(diǎn)的個(gè)數(shù)
number = node_number(pHead);
printf("節(jié)點(diǎn)的個(gè)數(shù)是%d\n", number);
//輸出最大值
max = cal_max(pHead);
printf("最大值是%d\n", m 8、ax);
//求最小值
min = cal_min(pHead);
printf("最小值是%d\n", min);
//刪除鏈表中值為x的第一個(gè)元素
printf("輸入刪除的元素值\n");
scanf("%d", &x);
do
{
printf("刪除所有的x按1, 首個(gè)x按0\n");
scanf("%d", &sert);
}while(sert<0||sert>1);
switch(sert)
{
case 0:
pHead = delete_x(pHead, x);
9、 printf("剩余的節(jié)點(diǎn)是\n");
front_output(pHead);
printf("\n");
break;
case 1:
pHead = delete_all_x(pHead, x);
printf("剩余的節(jié)點(diǎn)是\n");
front_output(pHead);
printf("\n");
break;
}
}
else
printf("鏈表為空\n");
}
//遞歸創(chuàng)建鏈表
NODE *creat_list(void)
{
ElemTy 10、pe n;
NODE *pNow;
scanf("%d", &n);
if(0==n)
return NULL;
else
{
pNow = (NODE *)malloc(sizeof(NODE));
if(NULL==pNow)
{
printf("內(nèi)存分配失敗\n");
exit(-1);
}
pNow->data = n;
pNow->next = creat_list();
}
return pNow;
}
//正向輸出鏈表內(nèi)容
void front_output(NODE *pHead 11、)
{
if(NULL==pHead)
return;
else
{
printf("%d ", pHead->data);
front_output(pHead->next);
}
}
//反向輸出鏈表的內(nèi)容
void back_output(NODE *pHead)
{
if(NULL == pHead)
return;
else
{
back_output(pHead->next);
printf("%d ", pHead->data);
}
}
//求節(jié)點(diǎn)的個(gè)數(shù)
int node_number( 12、NODE *pHead)
{
if(NULL==pHead)
return 0;
else
return (node_number(pHead->next)+1);
}
//求最大值
int cal_max(NODE *pHead)
{
int max, max1;
if(pHead->next==NULL)
max = pHead->data;
else
{
max = pHead->data;
max1 = (cal_max(pHead->next));
max = (max>max1)? max:max1;
13、
}
return max;
}
//求最小值
int cal_min(NODE *pHead)
{
int min, min1;
if(pHead->next == NULL)
min = pHead->data;
else
{
min = pHead->data;
min1 = cal_min(pHead->next);
min = (min 14、 NODE *pNow;
//下面是把等于x節(jié)點(diǎn)之前的鏈斷開,重新連接,把等于x節(jié)點(diǎn)之后的一部分鏈直接接到新形成的鏈的后面
if(pHead != NULL)
{
if(pHead->data != x)
{
pHead->next = delete_x(pHead->next, x);
return pHead;
}
else
{
pNow = pHead;
pHead = pHead->next;
free(pNow);
return pHead;
}
}
}
//刪除所有的x 15、節(jié)點(diǎn)
NODE *delete_all_x(NODE *pHead, int x)
{
NODE *pNow;
if(pHead!=NULL)
{
if(pHead->data!=x)
{
pHead->next = delete_all_x(pHead->next, x);
return pHead;
}
else
{
pNow = pHead;
pHead = pHead->next;
free(pNow);
return delete_all_x(pHead, x);
}
}
16、else
return NULL;
}
/*****************************************
輸入數(shù)據(jù)按0結(jié)束
1 2 3 4 2 7 2
0
正向輸出的結(jié)果是
1 2 3 4 2 7 2
反向輸出的結(jié)果是
2 7 2 4 3 2 1
節(jié)點(diǎn)的個(gè)數(shù)是7
最大值是7
最小值是1
輸入刪除的元素值
2
刪除所有的x按1, 首個(gè)x按0
1
剩余的節(jié)點(diǎn)是
1 3 4 7
Press any key to continue
*************************************************** 17、******/
//另加皇后的問題(僅供參考)
/******************************************
題目:采用遞歸求解皇后的問題(n*n)
實(shí)踐:狼影
時(shí)間:2012.10.1
*******************************************/
# include 18、int n);
int set[size];
int number = 0;
main()
{
int n;
printf("輸入n的大小\n");
scanf("%d", &n);
place(0,n);
printf("八皇后安放的方式有%d種\n", number);
}
//安放皇后
void place(int row,int n)
{
int i;
if(row>=n)
{
print(n);
number++;
fflush(stdin);
getchar();
}
for(i = 19、0; i 20、 i, j;
int a[size][size];
for(i = 0; i 21、放的方式有2種
Press any key to continue
***************************************/
//迷宮的問題
/****************************
題目:用棧輸出所有可能的迷宮路徑,并求最短路徑長度與最短的路徑
實(shí)踐:狼影
時(shí)間:2012.9.18
**************************************/
/************************************\
此題可以用遞歸很簡單的就輸出所有的路徑,不過下面用自己建棧的方式
******** 22、***************************************/
# include 23、'},
{'#', '#', '0', '#', '0', '0', '0', '#', '0', '#'},
{'#', '0', '0', '0', '0', '0', '0', '#', '0', '#'},
{'#', '0', '#', '#', '0', '#', '0', '0', '0', '#'},
{'#', '0', '#', '#', '0', '0', '0', '#', '#', '#'},
{'#', '0', '#', '#', '#', '0', '0', '0', '0', '#'},
24、 {'#', '0', '0', '0', '0', '0', '#', '#', '0', '#'},
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}
};
//定義節(jié)點(diǎn)
typedef struct
{
int x;
int y;
int di;
}STATE;
typedef struct
{
STATE state[size];
int top;
}STACK;
int sin = 0; //標(biāo)記是不是有路徑
int number = 25、0;
int max = 65535;
int clea;
STATE arry[size];//存放最短路徑
STATE cl[size];//存放最后的一條路徑
//函數(shù)的聲明
STACK *init_stack(void);
void find_path(STACK *stack);
void push_stack(STACK *stack, STATE st);
bool is_empty(STACK *stack);
void get_top(STACK *stack, STATE *st);
bool is_through(STATE st);
void p 26、op_stack(STACK *stack);
void print_map(void);
void shortest_path(STACK *stack);
void clear_map(void);
void re_paint(void);
main()
{
STACK *stack;
stack = init_stack();
printf("地圖的入點(diǎn)是(1,1)出口點(diǎn)是(8,8)\n");
find_path(stack);
if(0 == sin)
printf("沒有路徑\n");
else
{
printf("一共有% 27、d條路徑\n", number);
printf("最短路徑是\n");
re_paint();
print_map();
printf("\n");
}
}
//尋找路徑
void find_path(STACK *stack)
{
//將入口點(diǎn)入棧
STATE st;
st.x = 1;
st.y = 1;
st.di = -1;
push_stack(stack, st);
map[st.x][st.y] = '\1';
while(!is_empty(stack))
{
get_top(stac 28、k, &st);
if(8==st.x && 8==st.y)
{
sin = 1;//有路徑的話sin標(biāo)記為1
print_map();
printf("\n");
number++;
shortest_path(stack);
map[stack->state[stack->top].x][stack->state[stack->top].y] = '0';
pop_stack(stack);
}
else
{
while(st.di<4 && !is_through(st))//當(dāng) 當(dāng) 29、前點(diǎn)的四個(gè)方向沒有瀏覽完并且瀏覽的方向不通時(shí),循環(huán)
{
st.di++;
switch(st.di) //改變方向(有上下左右四個(gè)方向)
{
case 0: st.x = stack->state[stack->top].x-1;
st.y = stack->state[stack->top].y;
break;
case 1: st.x = stack->state[stack->top].x;
st.y = stack->state[stack->top].y+1;
30、 break;
case 2: st.x = stack->state[stack->top].x+1;
st.y = stack->state[stack->top].y;
break;
case 3: st.x = stack->state[stack->top].x;
st.y = stack->state[stack->top].y-1;
break;
default: break;
}
}
stack->state[stack->top].di = s 31、t.di; //記錄當(dāng)前點(diǎn)走向哪個(gè)方向的相鄰點(diǎn)
if(is_through(st))
{
st.di = -1;
push_stack(stack, st);
map[st.x][st.y] = '\1';
}
else
{
map[stack->state[stack->top].x][stack->state[stack->top].y] = '0';
pop_stack(stack);
}
}
}
}
//初始化隊(duì)列
STACK *init_sta 32、ck(void)
{
STACK *stack = (STACK *)malloc(sizeof(STACK));
if(NULL == stack)
{
printf("內(nèi)存分配失敗\n");
exit(-1);
}
stack->top = -1;
return stack;
}
//入隊(duì)列
void push_stack(STACK *stack, STATE st)
{
stack->top++;
stack->state[stack->top].di = st.di;
stack->state[stack->top].x 33、= st.x;
stack->state[stack->top].y = st.y;
}
//判斷空
bool is_empty(STACK *stack)
{
if(-1 == stack->top)
return true;
else
return false;
}
//獲得棧頂元素
void get_top(STACK *stack, STATE *st)
{
if(is_empty(stack))
{
printf("棧空\n");
return;
}
st->x = stack->state[stack- 34、>top].x;
st->y = stack->state[stack->top].y;
st->di = stack->state[stack->top].di;
}
//判斷是不是可以通過
bool is_through(STATE st)
{
if('0' == map[st.x][st.y])
return true;
else
return false;
}
//出棧操作
void pop_stack(STACK *stack)
{
if(is_empty(stack))
{
printf("??誠n");
35、return;
}
else
{
stack->top--;
}
}
//打印地圖
void print_map(void)
{
int i, j;
for(i = 0; i<10; i++)
{
for(j = 0; j<10; j++)
{
printf("%c ", map[i][j]);
}
printf("\n");
}
}
//尋找最短路徑
void shortest_path(STACK *stack)
{
int i;
//記錄最后的路徑,為了清除重繪
fo 36、r(i = 0; i<=stack->top; i++)
{
cl[i] = stack->state[i];
}
clea = stack->top;
//記下最短的路徑坐標(biāo)
if(stack->top
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點(diǎn)美食推薦
- XX國有企業(yè)黨委書記個(gè)人述責(zé)述廉報(bào)告及2025年重點(diǎn)工作計(jì)劃
- 世界濕地日濕地的含義及價(jià)值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點(diǎn)節(jié)后常見的八大危險(xiǎn)
- 廈門城市旅游介紹廈門景點(diǎn)介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點(diǎn)推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個(gè)個(gè)會(huì)應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點(diǎn)
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案