数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx

上传人:b****6 文档编号:7740053 上传时间:2023-01-26 格式:DOCX 页数:24 大小:18.66KB
下载 相关 举报
数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx_第1页
第1页 / 共24页
数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx_第2页
第2页 / 共24页
数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx_第3页
第3页 / 共24页
数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx_第4页
第4页 / 共24页
数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx

《数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx》由会员分享,可在线阅读,更多相关《数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx(24页珍藏版)》请在冰豆网上搜索。

数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx

数据结构教程习题答案李蓉蓉安杨等编著第三版第二章答案

2.2

/*******************************************

题目:

设计一个算法,将x插入到有序表中的适当位置,并且使插入后仍未有序表

设计:

狼影

时间:

2012.9.14

***********************************************/

#include

#definesize100

//定义节点

typedefstructnode

{

intdata[size];

intlength;

}NODE;

//函数的声明

voidinsertlist(NODE*arrylist,intn);

voidcreatlist(NODE*arrylist);

main()

{

NODEarrylist;

intn,i;

printf("输入数据的个数\n");

scanf("%d",&arrylist.length);

creatlist(&arrylist);

printf("请输入要插入的数字\n");

scanf("%d",&n);

insertlist(&arrylist,n);

//输出插入后的结果

printf("插入后的结果是\n");

for(i=0;i

{

printf("%d",arrylist.data[i]);

}

printf("\n");

}

//创建线性表

voidcreatlist(NODE*arrylist)

{

inti;

printf("输入有序的数据\n");

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

{

scanf("%d",&arrylist->data[i]);

}

}

//对数值进行插入

voidinsertlist(NODE*arrylist,intn)

{

inti;

intj=arrylist->length;

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

{

if(n>arrylist->data[i]);

else

{

for(;j>i;j--)

{

arrylist->data[j]=arrylist->data[j-1];

}

arrylist->data[i]=n;

arrylist->length++;

return;

}

}

arrylist->data[arrylist->length]=n;

arrylist->length++;

}

/**************************************************

输入数据的个数

3

输入有序的数据

123

请输入要插入的数字

0

插入后的结果是

0123

Pressanykeytocontinue

*******************************************************************/

2.3

/*********************************************

题目:

将一个带头结点的数据域依次为a1a2a3a4.....an的链表进行逆置

实践:

狼影

时间:

2012.9.14

************************************************/

#include

#include

//定义节点

typedefstructnode

{

intdata;

structnode*pNext;

}NODE;

//创建链表

voidcreatlist(NODE*pHead,intn);

voidtraverse(NODE*pHead);

voidprintlist(NODE*pHead);

main()

{

intn;

NODE*pHead=(NODE*)malloc(sizeof(NODE));

if(NULL==pHead)

{

printf("内存分配错误\n");

exit(-1);

}

pHead->pNext=NULL;

printf("输入节点的个数\n");

scanf("%d",&n);

creatlist(pHead,n);

traverse(pHead);

printf("转置后的数据是\n");

printlist(pHead);

}

//创建链表

voidcreatlist(NODE*pHead,intn)

{

NODE*pNew;

NODE*pNow=pHead;

inti;

 

printf("输入数据\n");

for(i=0;i

{

pNew=(NODE*)malloc(sizeof(NODE));

if(NULL==pNew)

{

printf("内存分配失败\n");

exit(-1);

}

pNew->pNext=NULL;

scanf("%d",&pNew->data);

pNow->pNext=pNew;

pNow=pNew;

}

}

//进行转置

voidtraverse(NODE*pHead)

{

NODE*pNow;

NODE*pNew=pHead->pNext;

pHead->pNext=NULL;

while(pNew!

=NULL)

{

pNow=pNew;

pNew=pNow->pNext;

pNow->pNext=pHead->pNext;

pHead->pNext=pNow;

}

}

//进行输出

voidprintlist(NODE*pHead)

{

NODE*pNow=pHead->pNext;

//利用前叉法进行表的重建

while(NULL!

=pNow)

{

printf("%d",pNow->data);

pNow=pNow->pNext;

}

printf("\n");

}

/*********************************************

输入节点的个数

4

输入数据

1234

转置后的数据是

4321

Pressanykeytocontinue

***************************************/

2.4

/**********************************************

题目:

设有一个双链表,每个节点中除有prior,data和next三个域外,还有一个访问频度域,在链表被启用之前,其值均初始化为0

,每当进行定位操作时零元素值为x的节点中的frep域的值加一,并调整表中节点的次序,使其按访问频度的递减排列

以便使频繁访问的节点总是靠近表头,尝试编写符合上述要求的算法

设计:

狼影

时间:

2012.9.14

**************************************************************************/

#include

#include

#definesize5//在这修改查找的次数

//定义节点

typedefstructnode

{

intdata;

intfrep;

structnode*pRior;

structnode*pNext;

}NODE;

 

//函数声明

NODE*initlist(void);

voidcreatlist(NODE*pHead,intn);

voidprintlist(NODE*pHead);

intlocatelist(NODE*pHead,inte);

voidInsertsort(NODE*pHead);

main()

{

intn;

inti;

inte;

intpos;

intnumber=size;

NODE*pHead;

pHead=initlist();

printf("输入节点个数\n");

scanf("%d",&n);

creatlist(pHead,n);

printf("你可以查找%d次数的位置\n",number);

for(i=0;i

{

printf("输入要查找的数的\n");

scanf("%d",&e);

pos=locatelist(pHead,e);//查找位置

if(0!

=pos)

{

printf("你要查找的数据的位置是%d\n",pos);

Insertsort(pHead);//排序

printf("查找后链表的次序\n");

printlist(pHead);

}

else

{

printf("你输的数不存在,重新输入\n");

i--;

}

}

}

//对链表进行初始化

NODE*initlist(void)

{

NODE*pHead=(NODE*)malloc(sizeof(NODE));

if(NULL==pHead)

{

printf("内存分配错误\n");

exit(-1);

}

pHead->pNext=NULL;

pHead->pRior=NULL;

returnpHead;

}

//创建链表

voidcreatlist(NODE*pHead,intn)

{

inti;

NODE*pNow=pHead;

NODE*pNew;

printf("输入数据\n");

for(i=0;i

{

pNew=(NODE*)malloc(sizeof(NODE));

if(NULL==pNew)

{

printf("分配内存失败\n");

exit(-1);

}

pNew->frep=0;

scanf("%d",&pNew->data);

pNew->pNext=NULL;

pNew->pRior=pNow;

pNow->pNext=pNew;

pNow=pNew;

}

}

//对链表进行输出

voidprintlist(NODE*pHead)

{

NODE*pNow=pHead->pNext;

while(NULL!

=pNow)

{

printf("节点的数据%d---",pNow->data);

printf("被查的频率%d\n",pNow->frep);

printf("\n");

pNow=pNow->pNext;

}

}

//对数据进行定位

intlocatelist(NODE*pHead,inte)

{

intpos=0;

NODE*pNow=pHead->pNext;

while(pNow!

=NULL)

{

pos++;

if(pNow->data==e)

{

pNow->frep++;

returnpos;

}

pNow=pNow->pNext;

}

if(NULL==pNow)

{

printf("没有要查找的数据\n");

return0;

}

}

//对链表进行排序

voidInsertsort(NODE*pHead)

{

NODE*pNow1=pHead->pNext;

NODE*pNew=pHead;

NODE*pNow2;

if(NULL!

=pNow1)

{

pNow2=pNow1->pNext;

pNow1->pNext=NULL;

pNow1=pNow2;

while(NULL!

=pNow1)

{

pNow2=pNow1->pNext;

pNew=pHead;

while(pNew->pNext!

=NULL&&pNew->pNext->frep>=pNow1->frep)

pNew=pNew->pNext;

pNow1->pNext=pNew->pNext;

pNow1->pRior=pNew;

if(NULL!

=pNew->pNext)

pNew->pNext->pRior=pNow1;

pNew->pNext=pNow1;

pNow1=pNow2;

}

}

}

/*****************************************************

输入节点个数

4

输入数据

1234

你可以查找5次数的位置

输入要查找的数的

1

你要查找的数据的位置是1

查找后链表的次序

节点的数据1---被查的频率1

节点的数据2---被查的频率0

节点的数据3---被查的频率0

节点的数据4---被查的频率0

输入要查找的数的

2

你要查找的数据的位置是2

查找后链表的次序

节点的数据1---被查的频率1

节点的数据2---被查的频率1

节点的数据3---被查的频率0

节点的数据4---被查的频率0

输入要查找的数的

2

你要查找的数据的位置是2

查找后链表的次序

节点的数据2---被查的频率2

节点的数据1---被查的频率1

节点的数据3---被查的频率0

节点的数据4---被查的频率0

输入要查找的数的

3

你要查找的数据的位置是3

查找后链表的次序

节点的数据2---被查的频率2

节点的数据1---被查的频率1

节点的数据3---被查的频率1

节点的数据4---被查的频率0

输入要查找的数的

3

你要查找的数据的位置是3

查找后链表的次序

节点的数据2---被查的频率2

节点的数据3---被查的频率2

节点的数据1---被查的频率1

节点的数据4---被查的频率0

Pressanykeytocontinue

*****************************************************/

2.5

/**************************************

题目:

设ha={a1,a2,a3,a4.....an},hb={b1,b2,b3,b4.....bn}是两个带头结点的循环单链表,将这两个表合并为带

头结点的循环单链表hc

设计:

狼影

时间:

2012.9.15

**************************************/

#include

#include

#definesize5//节点的个数

//定义节点

typedefstructnode

{

ints;

intdata;

structnode*pNext;

}NODE;

//函数声明

voidcreatlist(NODE*pHead);

voidmerge(NODE*pHead1,NODE*pHead2);

voidprintlist(NODE*pHead);

main()

{

NODE*pHead1;

NODE*pHead2;

pHead1=(NODE*)malloc(sizeof(NODE*));

if(NULL==pHead1)

{

printf("内存分配错误\n");

exit(-1);

}

pHead1->pNext=NULL;

pHead2=(NODE*)malloc(sizeof(NODE*));

if(NULL==pHead2)

{

printf("内存分配错误\n");

exit(-1);

}

pHead2->pNext=NULL;

//创建链表

creatlist(pHead1);

creatlist(pHead2);

//在这里我的理解只是将两个链表简单的连在一起并没有,其他判断是否有相同数据的条件

merge(pHead1,pHead2);

printf("输出连接后的链表\n");

printlist(pHead1);

}

//创建链表

voidcreatlist(NODE*pHead)

{

NODE*pNow=pHead;

NODE*pNew;

inti;

printf("输入%d个数据\n",size);

for(i=0;i

{

pNew=(NODE*)malloc(sizeof(NODE));

if(NULL==pNew)

{

printf("内存分配错误\n");

exit(-1);

}

pNew->pNext=NULL;

scanf("%d",&pNew->data);

if(i==size-1)

pNew->s=1;

else

pNew->s=0;

pNow->pNext=pNew;

pNow=pNew;

}

pNow->pNext=pHead;

}

//将两个链表合并(合并到pHead1的后面)

voidmerge(NODE*pHead1,NODE*pHead2)

{

NODE*pNow2=pHead2->pNext;

NODE*pNew=pHead2->pNext;

NODE*pNow1=pHead1->pNext;

while(pNow1->s!

=1)

{

pNow1=pNow1->pNext;

}

while(pNow2->s!

=1)

{

pNow2=pNow2->pNext;

}

pNow1->pNext=pNew;

pNow1->s=0;

pNow2->pNext=pHead1;

free(pHead2);

}

//打印链表

voidprintlist(NODE*pHead)

{

NODE*pNow=pHead->pNext;

while(pNow->s!

=1)

{

printf("%d",pNow->data);

pNow=pNow->pNext;

}

printf("%d",pNow->data);

printf("\n");

}

/******************************************\

输入5个数据

12345

输入5个数据

67890

输出连接后的链表

1234567890

Pressanykeytocontinue

********************************************************/

 

2.6

/******************************************

题目:

设非空线性表ha,hb都用带头结点的循环双链表表示,设计一个算法Inset(ha,hb,i)

i=0,将线性表hb插到线性表ha的最前面;当i>0时,将线性表hb插入到线性表ha中第i个节点的

后面,当i大于等于线性表ha的长度,将线性表hb插入到线性表的最后面

设计;狼影

时间:

2012.9.15

****************************************************/

#include

#include

//定义节点

typedefstructnode

{

intdata;

structnode*pNext;

structnode*pRior;

}NODE;

typedefstructd

{

NODE*pHead1;

NODE*pHead2;

}DATA;

intn;

//函数声明

voidcreatlist(DATA*elem);

voidprintlist(NODE*pHead);

voidInsertlist(DATA*elem,inti);

main()

{

inti;

DATA*elem=(DATA*)malloc(sizeof(DATA));

if(NULL==elem)

{

printf("内存分配失败\n");

exit(-1);

}

elem->pHead1=NULL;

elem->pHead2=NULL;

creatlist(elem);

printf("请输入插入的位置\n");

scanf("%d",&i);

Insertlist(elem,i);

if(i==0)

printlist(elem->pHead2);

elseif(i>0)

printlist(elem->pHead1);

else

printf("i应输入正值\n");

}

//创建非空链表

voidcreatlist(DATA*elem)

{

inti;

NODE*pNow,*pNew;

printf("输入结点的个数\n");

scanf("%d",&n);

//创建第一个链表

printf("创建第一个链表\n");

printf("输入数据\n");

for(i=0;i

{

pNew=(NODE*)malloc(sizeof(NODE));

if

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1