数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx
- 文档编号:7740053
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:24
- 大小:18.66KB
数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx
《数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx》由会员分享,可在线阅读,更多相关《数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案.docx(24页珍藏版)》请在冰豆网上搜索。
数据结构教程习题答案李蓉蓉安杨等编著第三版第二章答案
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;i { scanf("%d",&arrylist->data[i]); } } //对数值进行插入 voidinsertlist(NODE*arrylist,intn) { inti; intj=arrylist->length; for(i=0;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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案 数据结构 教程 习题 答案 编著 第三 第二