数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx
《数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx》由会员分享,可在线阅读,更多相关《数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx(24页珍藏版)》请在冰豆网上搜索。
![数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx](https://file1.bdocx.com/fileroot1/2023-1/22/a19290ad-fcd3-4bb9-bdbe-5d38070971e8/a19290ad-fcd3-4bb9-bdbe-5d38070971e81.gif)
数据结构教程习题答案李蓉蓉安杨等编著第三版第二章答案
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