1、数据结构教程习题答案 李蓉蓉 安杨等编著第三版 第二章答案 2.2/* 题目:设计一个算法,将x插入到有序表中的适当位置,并且使插入后仍未有序表 设计:狼影 时间:2012.9.14*/# include # define size 100/定义节点typedef struct node int datasize; int length;NODE;/函数的声明void insertlist(NODE *arrylist, int n);void creatlist(NODE *arrylist);main() NODE arrylist; int n, i; printf(输入数据的个数n);
2、 scanf(%d, &arrylist.length); creatlist(&arrylist); printf(请输入要插入的数字n); scanf(%d, &n); insertlist(&arrylist, n); /输出插入后的结果 printf(插入后的结果是n); for(i = 0; iarrylist.length; i+) printf(%d , arrylist.datai); printf(n);/创建线性表void creatlist(NODE *arrylist) int i; printf(输入有序的数据n); for(i = 0; ilength; i+) s
3、canf(%d, &arrylist-datai); /对数值进行插入void insertlist(NODE *arrylist, int n) int i; int j = arrylist-length; for(i = 0; ilength; i+) if(narrylist-datai); else for(; ji; j-) arrylist-dataj = arrylist-dataj-1; arrylist-datai = n; arrylist-length+; return; arrylist-dataarrylist-length = n; arrylist-length
4、+;/*输入数据的个数3输入有序的数据1 2 3请输入要插入的数字0插入后的结果是0 1 2 3Press any key to continue*/ 2.3/* 题目:将一个带头结点的数据域依次为a1 a2 a3 a4.an 的链表进行逆置 实践:狼影 时间:2012.9.14*/# include # include /定义节点typedef struct node int data; struct node *pNext;NODE;/创建链表void creatlist(NODE *pHead, int n);void traverse(NODE *pHead);void printli
5、st(NODE *pHead);main() int n; 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);/创建链表void creatlist(NODE *pHead, int n) NODE *pNew; NODE
6、*pNow = pHead; int i; printf(输入数据n); for(i = 0; ipNext = NULL; scanf(%d, &pNew-data); pNow-pNext = pNew; pNow = pNew; /进行转置void traverse(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 =
7、pNow; /进行输出void printlist(NODE *pHead) NODE *pNow = pHead-pNext; /利用前叉法进行表的重建 while(NULL != pNow) printf(%d , pNow-data); pNow = pNow-pNext; printf(n);/*输入节点的个数4输入数据1 2 3 4转置后的数据是4 3 2 1Press any key to continue*/2.4/*题目:设有一个双链表,每个节点中除有prior,data和next三个域外,还有一个访问频度域,在链表被启用之前,其值均初始化为0 ,每当进行定位操作时零元素值为x
8、的节点中的frep域的值加一,并调整表中节点的次序,使其按访问频度的递减排列 以便使频繁访问的节点总是靠近表头,尝试编写符合上述要求的算法设计:狼影时间:2012.9.14*/# include # include # define size 5 /在这修改查找的次数/定义节点typedef struct node int data; int frep; struct node *pRior; struct node *pNext;NODE;/函数声明NODE *initlist(void);void creatlist(NODE *pHead, int n);void printlist(N
9、ODE *pHead);int locatelist(NODE *pHead, int e);void Insertsort(NODE *pHead);main() int n; int i; int e; int pos; int number = size; NODE *pHead; pHead = initlist(); printf(输入节点个数n); scanf(%d, &n); creatlist(pHead, n); printf(你可以查找%d次数的位置n, number); for(i = 0; ipNext = NULL; pHead-pRior = NULL; retur
10、n pHead;/创建链表void creatlist(NODE*pHead, int n) int i; NODE *pNow = pHead; NODE *pNew; printf(输入数据n); for(i = 0; ifrep = 0; scanf(%d, &pNew-data); pNew-pNext = NULL; pNew-pRior = pNow; pNow-pNext = pNew; pNow = pNew; /对链表进行输出void printlist(NODE *pHead) NODE *pNow = pHead-pNext; while(NULL != pNow) pr
11、intf(节点的数据%d-, pNow-data); printf(被查的频率%dn, pNow-frep); printf(n); pNow = pNow-pNext; /对数据进行定位int locatelist(NODE *pHead, int e) int pos = 0; NODE *pNow = pHead-pNext; while(pNow != NULL) pos +; if( pNow-data = e) pNow-frep +; return pos; pNow = pNow-pNext; if(NULL = pNow) printf(没有要查找的数据n); return
12、0; /对链表进行排序void Insertsort(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-p
13、Next; pNow1-pNext = pNew-pNext; pNow1-pRior = pNew; if(NULL != pNew-pNext) pNew-pNext-pRior = pNow1; pNew-pNext = pNow1; pNow1 = pNow2; /*输入节点个数4输入数据1 2 3 4你可以查找5次数的位置输入要查找的数的1你要查找的数据的位置是1查找后链表的次序节点的数据1-被查的频率1节点的数据2-被查的频率0节点的数据3-被查的频率0节点的数据4-被查的频率0输入要查找的数的2你要查找的数据的位置是2查找后链表的次序节点的数据1-被查的频率1节点的数据2-被查的
14、频率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-被查的频率0Press any key to continue*/2
15、.5/* 题目:设ha = a1,a2, a3, a4.an, hb = b1, b2, b3, b4.bn是两个带头结点的循环单链表,将这两个表合并为带 头结点的循环单链表hc 设计:狼影 时间:2012.9.15*/# include # include # define size 5 /节点的个数/定义节点typedef struct node int s; int data; struct node *pNext;NODE;/函数声明void creatlist(NODE *pHead);void merge(NODE *pHead1, NODE *pHead2);void print
16、list(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(
17、pHead2); /在这里我的理解只是将两个链表简单的连在一起并没有,其他判断是否有相同数据的条件 merge(pHead1, pHead2); printf(输出连接后的链表n); printlist(pHead1);/创建链表void creatlist(NODE *pHead) NODE *pNow = pHead; NODE *pNew; int i; printf(输入%d个数据n, size); for(i = 0; ipNext = NULL; scanf(%d, &pNew-data); if(i = size-1) pNew-s = 1; else pNew-s = 0; p
18、Now-pNext = pNew; pNow = pNew; pNow-pNext = pHead;/将两个链表合并(合并到pHead1的后面)void merge(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; pNow
19、1-s = 0; pNow2-pNext = pHead1; free(pHead2);/打印链表void printlist(NODE *pHead) NODE *pNow = pHead-pNext; while(pNow-s != 1) printf(%d , pNow-data); pNow = pNow-pNext; printf(%d, pNow-data); printf(n);/*输入5个数据1 2 3 4 5输入5个数据6 7 8 9 0输出连接后的链表1 2 3 4 5 6 7 8 9 0Press any key to continue*/2.6/* 题目:设非空线性表h
20、a,hb都用带头结点的循环双链表表示,设计一个算法Inset(ha, hb, i) i = 0, 将线性表hb插到线性表ha的最前面;当i0时,将线性表hb插入到线性表ha中第i个节点的 后面,当i大于等于线性表ha的长度,将线性表hb插入到线性表的最后面 设计;狼影 时间:2012.9.15*/# include # include /定义节点typedef struct node int data; struct node *pNext; struct node *pRior;NODE;typedef struct d NODE *pHead1; NODE *pHead2;DATA;int
21、 n; /函数声明void creatlist(DATA *elem);void printlist(NODE *pHead);void Insertlist(DATA *elem, int i);main() int i; 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); else if(i0) printlist(elem-pHead1); else printf(i应输入正值n); /创建非空链表void creatlist(DATA *elem) int i; NODE *pNow, *pNew; printf(输入结点的个数n); scanf(%d, &n); /创建第一个链表 printf(创建第一个链表n); printf(输入数据n); for(i = 0; in; i+) pNew = (NODE *)malloc(sizeof(NODE); if
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1