数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案Word文件下载.docx
《数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
arrylist,n);
//输出插入后的结果
插入后的结果是\n"
for(i=0;
i<
arrylist.length;
i++)
{
printf("
%d"
arrylist.data[i]);
}
\n"
}
//创建线性表
voidcreatlist(NODE*arrylist)
inti;
输入有序的数据\n"
arrylist->
length;
scanf("
data[i]);
//对数值进行插入
voidinsertlist(NODE*arrylist,intn)
intj=arrylist->
if(n>
else
{
for(;
j>
i;
j--)
{
arrylist->
data[j]=arrylist->
data[j-1];
}
arrylist->
data[i]=n;
length++;
return;
}
arrylist->
data[arrylist->
length]=n;
/**************************************************
输入数据的个数
3
输入有序的数据
123
请输入要插入的数字
插入后的结果是
0123
Pressanykeytocontinue
*******************************************************************/
2.3
/*********************************************
将一个带头结点的数据域依次为a1a2a3a4.....an的链表进行逆置
实践:
************************************************/
stdlib.h>
typedefstructnode
intdata;
structnode*pNext;
//创建链表
voidcreatlist(NODE*pHead,intn);
voidtraverse(NODE*pHead);
voidprintlist(NODE*pHead);
intn;
NODE*pHead=(NODE*)malloc(sizeof(NODE));
if(NULL==pHead)
内存分配错误\n"
exit(-1);
pHead->
pNext=NULL;
输入节点的个数\n"
creatlist(pHead,n);
traverse(pHead);
转置后的数据是\n"
printlist(pHead);
voidcreatlist(NODE*pHead,intn)
NODE*pNew;
NODE*pNow=pHead;
输入数据\n"
n;
pNew=(NODE*)malloc(sizeof(NODE));
if(NULL==pNew)
printf("
内存分配失败\n"
exit(-1);
pNew->
pNew->
data);
pNow->
pNext=pNew;
pNow=pNew;
//进行转置
voidtraverse(NODE*pHead)
NODE*pNow;
NODE*pNew=pHead->
pNext;
while(pNew!
=NULL)
pNew=pNow->
pNext=pHead->
pHead->
pNext=pNow;
//进行输出
voidprintlist(NODE*pHead)
NODE*pNow=pHead->
//利用前叉法进行表的重建
while(NULL!
=pNow)
pNow->
pNow=pNow->
输入节点的个数
4
输入数据
1234
转置后的数据是
4321
***************************************/
2.4
/**********************************************
题目:
设有一个双链表,每个节点中除有prior,data和next三个域外,还有一个访问频度域,在链表被启用之前,其值均初始化为0
,每当进行定位操作时零元素值为x的节点中的frep域的值加一,并调整表中节点的次序,使其按访问频度的递减排列
以便使频繁访问的节点总是靠近表头,尝试编写符合上述要求的算法
设计:
时间:
**************************************************************************/
#definesize5//在这修改查找的次数
intfrep;
structnode*pRior;
//函数声明
NODE*initlist(void);
intlocatelist(NODE*pHead,inte);
voidInsertsort(NODE*pHead);
inte;
intpos;
intnumber=size;
NODE*pHead;
pHead=initlist();
输入节点个数\n"
你可以查找%d次数的位置\n"
number);
number;
输入要查找的数的\n"
e);
pos=locatelist(pHead,e);
//查找位置
if(0!
=pos)
你要查找的数据的位置是%d\n"
pos);
Insertsort(pHead);
//排序
查找后链表的次序\n"
printlist(pHead);
你输的数不存在,重新输入\n"
i--;
//对链表进行初始化
NODE*initlist(void)
pRior=NULL;
returnpHead;
voidcreatlist(NODE*pHead,intn)
分配内存失败\n"
frep=0;
pRior=pNow;
//对链表进行输出
节点的数据%d---"
被查的频率%d\n"
frep);
//对数据进行定位
intlocatelist(NODE*pHead,inte)
intpos=0;
while(pNow!
pos++;
if(pNow->
data==e)
pNow->
frep++;
returnpos;
if(NULL==pNow)
没有要查找的数据\n"
return0;
//对链表进行排序
voidInsertsort(NODE*pHead)
NODE*pNow1=pHead->
NODE*pNew=pHead;
NODE*pNow2;
if(NULL!
=pNow1)
pNow2=pNow1->
pNow1->
pNow1=pNow2;
while(NULL!
pNow2=pNow1->
pNew=pHead;
while(pNew->
pNext!
=NULL&
&
pNew->
pNext->
frep>
=pNow1->
frep)
pNew=pNew->
pNow1->
pNext=pNew->
pRior=pNew;
if(NULL!
=pNew->
pNext)
pNew->
pRior=pNow1;
pNew->
pNext=pNow1;
pNow1=pNow2;
/*****************************************************
输入节点个数
你可以查找5次数的位置
输入要查找的数的
1
你要查找的数据的位置是1
查找后链表的次序
节点的数据1---被查的频率1
节点的数据2---被查的频率0
节点的数据3---被查的频率0
节点的数据4---被查的频率0
2
你要查找的数据的位置是2
节点的数据2---被查的频率1
节点的数据2---被查的频率2
你要查找的数据的位置是3
节点的数据3---被查的频率1
节点的数据3---被查的频率2
*****************************************************/
2.5
/**************************************
设ha={a1,a2,a3,a4.....an},hb={b1,b2,b3,b4.....bn}是两个带头结点的循环单链表,将这两个表合并为带
头结点的循环单链表hc
2012.9.15
**************************************/
#definesize5//节点的个数
ints;
voidcreatlist(NODE*pHead);
voidmerge(NODE*pHead1,NODE*pHead2);
NODE*pHead1;
NODE*pHead2;
pHead1=(NODE*)malloc(sizeof(NODE*));
if(NULL==pHead1)
pHead1->
pHead2=(NODE*)malloc(sizeof(NODE*));
if(NULL==pHead2)
pHead2->
//创建链表
creatlist(pHead1);
creatlist(pHead2);
//在这里我的理解只是将两个链表简单的连在一起并没有,其他判断是否有相同数据的条件
merge(pHead1,pHead2);
输出连接后的链表\n"
printlist(pHead1);
voidcreatlist(NODE*pHead)
输入%d个数据\n"
size);
size;
if(i==size-1)
s=1;
s=0;
pNow->
pNext=pHead;
//将两个链表合并(合并到pHead1的后面)
voidmerge(NODE*pHead1,NODE*pHead2)
NODE*pNow2=pHead2->
NODE*pNew=pHead2->
NODE*pNow1=pHead1->
while(pNow1->
s!
=1)
pNow1=pNow1->
while(pNow2->
pNow2=pNow2->
pNow1->
pNow2->
pNext=pHead1;
free(pHead2);
//打印链表
while(pNow->
/******************************************\
输入5个数据
12345
67890
输出连接后的链表
1234567890
********************************************************/
2.6
/******************************************
设非空线性表ha,hb都用带头结点的循环双链表表示,设计一个算法Inset(ha,hb,i)
i=0,将线性表hb插到线性表ha的最前面;
当i>
0时,将线性表hb插入到线性表ha中第i个节点的
后面,当i大于等于线性表ha的长度,将线性表hb插入到线性表的最后面
设计;
****************************************************/
typedefstructd
}DATA;
intn;
voidcreatlist(DATA*elem);
voidInsertlist(DATA*elem,inti);
DATA*elem=(DATA*)malloc(sizeof(DATA));
if(NULL==elem)
elem->
pHead1=NULL;
pHead2=NULL;
creatlist(elem);
请输入插入的位置\n"
i);
Insertlist(elem,i);
if(i==0)
printlist(elem->
pHead2);
elseif(i>
0)
pHead1);
else
i应输入正值\n"
//创建非空链表
voidcreatlist(DATA*elem)
NODE*pNow,*pNew;
输入结点的个数\n"
//创建第一个链表
创建第一个链表\n"
if