知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第二章参考答案

Posted 元素

篇首语:从某种意义来看,世间一切都是遇见,就像冷遇见暖,就有了雨;春遇见冬,就有了岁月;天遇见地,有了永恒;人遇见人,有了生命。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第二章参考答案相关的知识,希望对你有一定的参考价值。

  第二章 线性表

  

  Status DeleteK(SqList &a int i int k)//删除线性表a中第i个元素起的k个元素

  

  if(i< ||k< ||i+k >a length) return INFEASIBLE;

  for(count= ;i+count <=a length k;count++) //注意循环结束的条件

  a elem[i+count ]=a elem[i+count+k ];

  a length =k;

  return OK;

  //DeleteK

  

  Status Insert_SqList(SqList &va int x)//把x插入递增有序表va中

  

  if(va length+ >va listsize) return ERROR;

  va length++;

  for(i=va length ;va elem[i]>x&&i>= ;i )

  va elem[i+ ]=va elem[i];

  va elem[i+ ]=x;

  return OK;

  //Insert_SqList

  

  int ListComp(SqList A SqList B)//比较字符表A和B 并用返回值表示结果 值为正 表示A>B;值为负 表示A

  

  for(i= ;A elem[i]||B elem[i];i++)

  if(A elem[i]!=B elem[i]) return A elem[i] B elem[i];

  return ;

  //ListComp

  

  LNode* Locate(LinkList L int x)//链表上的元素查找 返回指针

  

  for(p=l >next;p&&p >data!=x;p=p >next);

  return p;

  //Locate

  

  int Length(LinkList L)//求链表的长度

  

  for(k= p=L;p >next;p=p >next k++);

  return k;

  //Length

  

  void ListConcat(LinkList ha LinkList hb LinkList &hc)//把链表hb接在ha后面形成链表hc

  

  hc=ha;p=ha;

  while(p >next) p=p >next;

  p >next=hb;

  //ListConcat

  

  见书后答案

  

  Status Insert(LinkList &L int i int b)//在无头结点链表L的第i个元素之前插入元素b

  

  p=L;q=(LinkList*)malloc(sizeof(LNode));

  q data=b;

  if(i== )

  

  q next=p;L=q; //插入在链表头部

  

  else

  

  while( i> ) p=p >next;

  q >next=p >next;p >next=q; //插入在第i个元素的位置

  

  //Insert

  

  Status Delete(LinkList &L int i)//在无头结点链表L中删除第i个元素

  

  if(i== ) L=L >next; //删除第一个元素

  else

  

  p=L;

  while( i> ) p=p >next;

  p >next=p >next >next; //删除第i个元素

  

  //Delete

  

  Status Delete_Beeen(Linklist &L int mink int maxk)//删除元素递增排列的链表L中值大于mink且小于maxk的所有元素

  

  p=L;

  while(p >next >data<=mink) p=p >next; //p是最后一个不大于mink的元素

  if(p >next) //如果还有比mink更大的元素

  

  q=p >next;

  while(q >datanext; //q是第一个不小于maxk的元素

  p >next=q;

  

  //Delete_Beeen

  

  Status Delete_Equal(Linklist &L)//删除元素递增排列的链表L中所有值相同的元素

  

  p=L >next;q=p >next; //p q指向相邻两元素

  while(p >next)

  

  if(p >data!=q >data)

  

  p=p >next;q=p >next; //当相邻两元素不相等时 p q都向后推一步

  

  else

  

  while(q >data==p >data)

  

  free(q);

  q=q >next;

  

  p >next=q;p=q;q=p >next; //当相邻元素相等时删除多余元素

  //else

  //while

  //Delete_Equal

  

  void reverse(SqList &A)//顺序表的就地逆置

  

  for(i= j=A length;i

  A elem[i]< >A elem[j];

  //reverse

  

  void LinkList_reverse(Linklist &L)//链表的就地逆置;为简化算法 假设表长大于

  

  p=L >next;q=p >next;s=q >next;p >next=NULL;

  while(s >next)

  

  q >next=p;p=q;

  q=s;s=s >next; //把L的元素逐个插入新表表头

  

  q >next=p;s >next=q;L >next=s;

  //LinkList_reverse

  分析:本算法的思想是 逐个地把L的当前元素q插入新的链表头部 p为新表表头

  

  void merge (LinkList &A LinkList &B LinkList &C)//把链表A和B合并为C A和B的元素间隔排列 且使用原存储空间

  

  p=A >next;q=B >next;C=A;

  while(p&&q)

  

  s=p >next;p >next=q; //将B的元素插入

  if(s)

  

  t=q >next;q >next=s; //如A非空 将A的元素插入

  

  p=s;q=t;

  //while

  //merge

  

  void reverse_merge(LinkList &A LinkList &B LinkList &C)//把元素递增排列的链表A和B合并为C 且C中元素递减排列 使用原空间

  

  pa=A >next;pb=B >next;pre=NULL; //pa和pb分别指向A B的当前元素

  while(pa||pb)

  

  if(pa >datadata||!pb)

  

  pc=pa;q=pa >next;pa >next=pre;pa=q; //将A的元素插入新表

  

  else

  

  pc=pb;q=pb >next;pb >next=pre;pb=q; //将B的元素插入新表

  

  pre=pc;

  

  C=A;A >next=pc; //构造新表头

  //reverse_merge

  分析:本算法的思想是 按从小到大的顺序依次把A和B的元素插入新表的头部pc处 最后处理A或B的剩余元素

  

  void SqList_Intersect(SqList A SqList B SqList &C)//求元素递增排列的线性表A和B的元素的交集并存入C中

  

  i= ;j= ;k= ;

  while(A elem[i]&&B elem[j])

  

  if(A elem[i]

  if(A elem[i]>B elem[j]) j++;

  if(A elem[i]==B elem[j])

  

  C elem[++k]=A elem[i]; //当发现了一个在A B中都存在的元素

  i++;j++; //就添加到C中

  

  //while

  //SqList_Intersect

  

  void LinkList_Intersect(LinkList A LinkList B LinkList &C)//在链表结构上重做上题

  

  p=A >next;q=B >next;

  pc=(LNode*)malloc(sizeof(LNode));

  while(p&&q)

  

  if(p >datadata) p=p >next;

  else if(p >data>q >data) q=q >next;

  else

  

  s=(LNode*)malloc(sizeof(LNode));

  s >data=p >data;

  pc >next=s;pc=s;

  p=p >next;q=q >next;

  

  //while

  C=pc;

  //LinkList_Intersect

  

  void SqList_Intersect_True(SqList &A SqList B)//求元素递增排列的线性表A和B的元素的交集并存回A中

  

  i= ;j= ;k= ;

  while(A elem[i]&&B elem[j])

  

  if(A elem[i]

  else if(A elem[i]>B elem[j]) j++;

  else if(A elem[i]!=A elem[k])

  

  A elem[++k]=A elem[i]; //当发现了一个在A B中都存在的元素

  i++;j++; //且C中没有 就添加到C中

  

  //while

  while(A elem[k]) A elem[k++]= ;

  //SqList_Intersect_True

  

  void LinkList_Intersect_True(LinkList &A LinkList B)//在链表结构上重做上题

  

  p=A >next;q=B >next;pc=A;

  while(p&&q)

  

  if(p >datadata) p=p >next;

  else if(p >data>q >data) q=q >next;

  else if(p >data!=pc >data)

  

  pc=pc >next;

  pc >data=p >data;

  p=p >next;q=q >next;

  

  //while

  //LinkList_Intersect_True

cha138/Article/program/sjjg/201311/23573

相关参考

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第八章答案

  第八章动态存储管理    typedefstruct  char*start;  intsize;  fmblock;//空闲块类型  char*Malloc_Fdlf(intn)//遵循最后分配

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第九章答案

  第九章查找    intSearch_Sq(SSTableSTintkey)//在有序表上顺序查找的算法监视哨设在高下标端    STelem[STlength+]key=key;  for(i=

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第六章答案

  第六章树和二叉树    intIs_Descendant_C(intuintv)//在孩子存储结构上判断u是否v的子孙是则返回否则返回    if(u==v)return;  else    if

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第五章答案

  第五章数组和广义表    voidRSh(intA[n]intk)//把数组A的元素循环右移k位只用一个辅助存储空间    for(i=;i<=k;i++)  if(n%i==&&a

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第三章参考答案

  第三章栈与队列    typedefstruct  Elemtype*base[];  Elemtype*top[];  BDStacktype;//双向栈类型  StatusInit_Stack

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第四章答案

  第四章串    voidString_Reverse(StringtypesStringtype&r)//求s的逆串r    StrAssign(r);//初始化r为空串  for(i=S

知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第七章答案

  第七章图    StatusBuild_AdjList(ALGraph&G)//输入有向图的顶点数边数顶点信息和边的信息建立邻接表    InitALGraph(G);  scanf(%d

知识大全 数据结构备考[4]

  四参考资料  目前国内数据结构教材的版本有PascalCC++Java多但C语言版本的教材是使用最广的教材虽然考试大纲还没有出来但基本上可以确定的教材是清华大学出版社出版严蔚敏等著的《数据结构(C

知识大全 数据结构与算法线性表复习习题6[3]

      假设在算法描述语言中引入指针的二元运算异或若a和b为指针则a⊕b的运算结果仍为原指针类型且  a⊕(a⊕b)=(a⊕a)⊕b=b