数据结构(C语版)清华大学出版社 课后题1-5章答案.docVIP

  • 15
  • 0
  • 约1.74万字
  • 约 8页
  • 2016-10-12 发布于贵州
  • 举报

数据结构(C语版)清华大学出版社 课后题1-5章答案.doc

数据结构(C语版)清华大学出版社 课后题1-5章答案

第一章 选择题 1.A 2.B 3.C 4.D 5.B 6.C 第二章 选择题 1.A 2.D 3.D 4.C 5.A 6.C 7.B 8.B 9.D 10.D 应用题 1. 应该选用链接存储表示。如果才用顺序表示法,必须在一个连续的可用空间中为这N个表分配空间。初始时候因为不知道哪个表增长得快,必须平均分配空间。在程序运行过程中,有的表占用的空间增长得快,有的表占用空间增长得慢,有的表很快就使用完了分配给它的空间,有的表才占用了少许空间,在进行元素的插入时候就必须成片的移动其他表的空间,以空出位置进行插入;在元素删除时为填补空白,也可能移动许多元素。这个处理过程及其繁琐和低效。 如果采用链接存储,一个表的空间可以连续也可以不连续。表的增长通过动态分配内存得以解决,只要存储器未满,就不会发生表溢出;表的收缩可以通过动态存储释放实现,释放的空间还可以在以后动态分配给其他的存储需求,非常灵活方便。对于N个表(包括表的总数可能变化)共存的情形,处理十分简单快捷,插入、删除时间复杂度为O(1)。所以才用链接存储表示较好。 2. 一般来说,链式存储结构克服了顺序存储结构的三个缺点。首先,插入、删除操作不需要移动元素,只修改指针;其次,不需要预先分配空间,可根据需要动态申请空间;其三,表容量只受到内存空间的限制。其缺点是因为指针增加了空间开销,当空间不允许时,就不能克服顺序存储的缺点。 3. 顺序结构时ai与ai+1的物理位置相邻,链表结构时两者的位置不要求一定相邻。 7. 在顺序表中插入和删除一个节点需平均移动全表一半的节点。具体的移动次数取决于所插入和删除的节点的位置i和全表的长度n这两个因素。 算法设计题 分析:遍历整个顺序表,用k记录在x~y之间元素的个数,k的初始值为0。对于当前遍历到的元素,若其值在x~y之间,则前移k个位置;否则执行++k。这样每个不在x~y之间的元素仅仅移动一次,所以效率较高。 void Delete_xy( SeqList *A,int x,int y ){ int k; k = 0; for( i=0;iA-length;++i ){ if( A-data[i]x A-data[i]y ) k++; else A-data[i-k] = A-data[i]; /* 当前元素前移k个位置 */ A-length = A-length - k; /* 线性表长度减小 */ } } 2.设集合A和B分别用两个递增有序的单链表表示,其中他们的头指针是pa和pb。求A交B的操作就是对A扫描,如果当前的扫描到的元素在B中出现则保留,否则删除。 LinkList AbingB( LinkList A,LinkList B ){ LinkList pa,pb,pre; pa = A-next; pb = B-next; pre = A; while( papb ){ if( pa-datapb-data ){ /* 若大于,则pb指针后移 */ q = pa; pa = pa-next; pre-next = pa; free(q); }else{ /* 相等,保留,pa、pb指针后移 */ pre = pa; pa = pa-next; pb = pb-next; } } while( pa ){ /* 若单链表A没有遍历完,则将剩余节点删除 */ q = pa; pa = pa-next; free(q); } pre-next = NULL; return (A); } 本算法的时间开销主要是遍历,故时间复杂度为O(n) 分析:依次遍历访问单链表的节点,用冒泡排序的思想将该链表整理成有序。冒泡排序算法的基本思想比较简单:两两比较元素,值域小的元素前置,直到不再发生交换。 LinkList Sort_LinkList( LinkList L ){ int x,noswap; LinkList pa,pb; pa = L-next; noswap = 1; if( pa ){ while( noswap ){ noswap = 0; pb = pa-next; while( pb(pb-next!=NULL) ){ if( pb-datapb-next-data ){ x = pb-data; pb-data = pb-next-data; pb-next-data = x; noswap = 1; } pb =

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档