原创 数据结构第二章习题参考答案(第二部分)

2008-3-31 21:14 3491 5 5 分类: 软件与OS
 

这是第2部分,其实还有几题没做,不过我不可能每题都做,没那么多时间啊.所有的课程资料,我会陆续放到 http://www.yulexuexi.cn/ 上,大家可以去那里看.

----------------------------------------------------------------------------------
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"



typedef struct _LNode
{
 int data;
 struct _LNode *next;
}LNode, *LinkList;


//创建一个新的带头结点链表,即创建一个空表
bool create_list(LinkList *L)
{
 LinkList p;
 if((p=(LinkList)malloc(sizeof(LNode)))==NULL)
  return false;
 p->next=NULL;
 *L=p;
 return true;
}
//将x插入链表L的第i个结点前
bool insert_list(LinkList L,int i,int x)
{
 LinkList p,q;
 int k="1";
 if((p=(LinkList)malloc(sizeof(LNode)))==NULL)
  return false;
 p->data=x;
 q=L;
 for(k=1;k<i;k++)
 {
  q="q-">next;
  if(q->next==NULL)
   return false;
 }
 p->next=q->next;
 q->next=p;
 return true;
}


//习题2.23
LinkList join_list(LinkList La, LinkList Lb)
{
 LinkList Lc,p,q;
 Lc=La;
 p=La->next;
 q=Lb->next;
 while(p!=NULL&&q!=NULL)
 {
  Lc->next=p;
  Lc=p;
  p=p->next;
  Lc->next=q;
  Lc=q;
  q=q->next;
 }
 if(p!=NULL)
  Lc->next=p;
 if(q!=NULL)
  Lc->next=q;
 Lc=La;
 return Lc;
}


//习题2.24
LinkList merge_list_descend(LinkList La, LinkList Lb)
{
 LinkList p,q,Lc,tmp;
 if(!create_list(&Lc))
  return NULL;
 
 p=La->next;
 q=Lb->next;
 while((p!=NULL)&&(q!=NULL))
 {
  if(p->data<q->data)
  {
    tmp=p->next;
    p->next=Lc->next;
    Lc->next=p;
    p=tmp;
  }
  else
  {
    tmp=q->next;
    q->next=Lc->next;
    Lc->next=q;
    q=tmp;
  }
 }
 while(p!=NULL)
 {
    tmp=p->next;
    p->next=Lc->next;
    Lc->next=p;
    p=tmp;                                                                                                                                                
 }



 while(q!=NULL)
 { 
    tmp=q->next;
    q->next=Lc->next;
    Lc->next=q;
    q=tmp;
 }
   
 return Lc;
}
  
//习题2.25
#define LIST_INIT_SIZE  100  
#define LISTINCREMENT   10


typedef struct{
 int *base;
 int length;
 int listsize;
}SqList;


bool init_sqlist(SqList *L)
{
 if((L->base=(int *)malloc(sizeof(int)*LIST_INIT_SIZE))==NULL)
  return false;
 
 L->length=0;
 L->listsize=LIST_INIT_SIZE;
 return true;
}


bool intersect_sqlist1(SqList *La, SqList *Lb,SqList *Lc)
{
 int i,j,k;
 //if(La->length+Lb->length>LIST_INIT_SIZE)
  //return false;
 
 for(i=0,j=0,k=0;i<La->length&&j<Lb->length&&k<LIST_INIT_SIZE;)
 {
  if(La->base<Lb->base[j])
   i++;
  else if(La->base>Lb->base[j])
   j++;
  else
  {
   Lc->base[k++]=Lb->base[j];
   i++;
   j++;
  }
 }
 if(k>=LIST_INIT_SIZE)
  return false;
 
 Lc->length=k;
 return true;
}



//习题2.27
SqList* intersect_sqlist2(SqList *La, SqList *Lb)
{
 int i,j,k;


 for(i=0,j=0,k=-1;i<La->length&&j<Lb->length;)
 {
  if(La->base<Lb->base[j])
   i++;
  else if(La->base>Lb->base[j])
   j++;
  else
  {
   if(k<0)
   {
    La->base[++k]=Lb->base[j];
    i++;
    j++;
   }
   else if(La->base[k]!=Lb->base[j])
   {
    La->base[++k]=Lb->base[j++];
    i++;
   }
   else
   {
    i++;
    j++;
   }
  }
 }
 La->length=k+1;
 return La;
}



//习题2.28
LinkList intersect_linklist(LinkList La, LinkList Lb)
{
 LinkList p,q,k,cur;
 p=La->next;
 q=Lb->next;
 cur=NULL;
 while(p!=NULL&&q!=NULL)
 {
  if(p->data<q->data)
  {
   k=p;
   p=p->next;
   free(k);
  }
  else if(p->data>q->data)
  {
   q=q->next;
  }
  else
  {
   if(cur==NULL)
   {
    cur=p;
    p=p->next;
    q=q->next;
    La->next=cur;
   }
   else if(cur->data!=q->data)
   {
    cur->next=p;
    p=p->next;
    q=q->next;
    cur=cur->next;
   }
   else
   {
    q=q->next;
    k=p;
    p=p->next;
    free(k);
   }
  }
 }
  if(cur!=NULL)
   cur->next=NULL;
  else
   La->next=NULL;
  return La;
}



//习题2.29


void delete_sqlist(SqList *sa, SqList *sb, SqList *sc)
{
 int i,j,k,cur,tmp=0;
 for(i=0,j=0,k=0,cur=0;i<sb->length&&j<sc->length&&k<sa->length;)
 {
  if(sa->base[k]<sb->base)
  {
   //i++;
   sa->base[cur++]=sa->base[k++];
  }
  else if(sa->base[k]<sc->base[j])
  {
   //j++;
   sa->base[cur++]=sa->base[k++];
  }
  else if(sa->base[k]>sb->base)
  {
   i++;
  }
  else //if(sa->base[k]==sb->base)
  {
   while(sa->base[k]>sc->base[j]&&j<sc->length)
    j++;
   if(sa->base[k]==sc->base[j]&&j<sc->length)
   {
    k++;
    tmp++;
   }
   else
    sa->base[cur++]=sa->base[k++];
  }
  /*
  else
  {
   i++;
   j++;
  }*/
 }
 for(;k<sa->length;k++,cur++)
 {
  sa->base[cur]=sa->base[k];
 }
 sa->length-=tmp;
}



//习题2.30
void delete_linklist(LinkList la,LinkList lb,LinkList lc)
{
 LinkList p,q,k,cur;
 p=lb->next;
 q=lc->next;
 k=la->next;
 cur=la;


 while(p!=NULL&&q!=NULL&&k!=NULL)
 {
  if(k->data<p->data)
  {
   cur=k;
   k=k->next;
  }
  else if(k->data<q->data)
  {
   cur=k;
   k=k->next;
  }
  else if(k->data>p->data)
   p=p->next;
  else
  {
   while(q->data<k->data&&q!=NULL)
    q=q->next;
   if(q!=NULL&&q->data==k->data)
   {
    cur->next=k->next;
    free(k);
    k=cur->next;
   }
   else
   {
    cur=k;
    k=k->next;
   }
  }
 }
}


 



 



int main(int argc,char * argv[])
{
 int i;
 //test ex2.23
 //先构造两个递增的list
 LinkList La,Lb,p;
 if(!create_list(&La))
 {
  printf("create La error\n");
  return 1;
 }
 if(!create_list(&Lb))
 {
  printf("create Lb error\n");
  return 1;
 }
 if(!insert_list(La,0,200))
 {
  printf("insert list error\n");
  return 1;
 }
 if(!insert_list(Lb,0,100))
 {
  printf("insert list error\n");
  return 1;
 }
 for(i=1;i<10;i++)
 {
  if(!insert_list(La,i,80+i))
  {
   printf("insert list error\n");
   return 1;
  }
 }
 printf("La now hold the following data:\n");
 printf("|-->");
 p=La->next;
 while(p!=NULL)
 {
  printf("%d-->",p->data);
  p="p-">next;
 }
 printf("^\n");
 for(i=1;i<10;i++)
 {
  if(!insert_list(Lb,i,70+i*2))
  {
   printf("insert list error\n");
   return 1;
  }
 }
 printf("Lb now hold the following data:\n");
 printf("|-->");
 p=Lb->next;
 while(p!=NULL)
 {
  printf("%d-->",p->data);
  p="p-">next;
 }
 printf("^\n");
 //测试ex2.23
 /*
 LinkList Lc="join"_list(La,Lb);
 printf("Lc now hold the following data:\n");
 printf("|-->");
 p=Lc->next;
 while(p!=NULL)
 {
  printf("%d-->",p->data);
  p="p-">next;
 }
 printf("^\n");
*/
 //测试ex2.24
 LinkList Ld="merge"_list_descend(La,Lb);
printf("Ld now hold the following data:\n");
 printf("|-->");
 p=Ld->next;
 while(p!=NULL)
 {
  printf("%d-->",p->data);
  p="p-">next;
 }
 printf("^\n");


 //test ex2.25
 //先创建两个顺序表(有序的)
 SqList sa,sb,sc;
 if(!init_sqlist(&sa))
 {
  printf("init sa error\n");
  return 1;
 }
 if(!init_sqlist(&sb))
 {
  printf("init sb error\n");
  return 1;
 }


 if(!init_sqlist(&sc))
 {
  printf("init sc error\n");
  return 1;
 }


 for(i=0;i<16;i++)
 {
  sa.base[i++]=24+i*2;
  sa.base=22+i*2;
 }
 
 sa.length=16;
 printf("sa hold:\n");
 for(i=0;i<sa.length;i++)
 {
  printf("%d\t",sa.base);
 }
 printf("\n");


 for(i=0;i<26;i++)
 {
  sb.base[i++]=16+i*2;
  sb.base=14+i*2;
 }
 
 sb.length=26;
 printf("sb hold:\n");
 for(i=0;i<sb.length;i++)
 {
  printf("%d\t",sb.base);
 }
 printf("\n");


 if(!intersect_sqlist1(&sa,&sb,&sc))
 {
  printf("merge sqlist error\n");
  return 1;
 }
 printf("after intersect1, sc hold:\n");
 for(i=0;i<sc.length;i++)
 {
  printf("%d\t",sc.base);
 }
 printf("\n");


 //test ex2.27
 intersect_sqlist2(&sa,&sb);
 printf("after intersect2, sa holdthe result!)\n");
 for(i=0;i<sa.length;i++)
 {
  printf("%d\t",sa.base);
 }
 printf("\n");



 //test ex2.28
 //先构造两个链表
 LinkList l1,l2,l3;
if(!create_list(&l1))
 {
  printf("create l1 error\n");
  return 1;
 }
 if(!create_list(&l2))
 {
  printf("create l2 error\n");
  return 1;
 }
 /*
 if(!create_list(&l3))
 {
  printf("create l3 error\n");
  return 1;
 }*/


 if(!insert_list(l1,0,69))
 {
  printf("insert list error\n");
  return 1;
 }
 if(!insert_list(l2,0,169))
 {
  printf("insert list error\n");
  return 1;
 }
 for(i=1;i<20;i++)
 {
  if(!insert_list(l1,i,50+i))
  {
   printf("insert list error\n");
   return 1;
  }
 }
 printf("l1 now hold the following data:\n");
 printf("|-->");
 p=l1->next;
 while(p!=NULL)
 {
  printf("%d-->",p->data);
  p="p-">next;
 }
 printf("^\n");


 for(i=1;i<10;i++)
 {
  if(!insert_list(l2,i,52+i))
  {
   printf("insert list error\n");
   return 1;
  }
 }
 printf("l2 now hold the following data:\n");
 printf("|-->");
 p=l2->next;
 while(p!=NULL)
 {
  printf("%d-->",p->data);
  p="p-">next;
 }
 printf("^\n");


 l3=intersect_linklist(l1,l2);
 printf("after intersect linklist ,result is :\n");


printf("|-->");
 p=l3->next;
 while(p!=NULL)
 {
  printf("%d-->",p->data);
  p="p-">next;
 }
 printf("^\n");
 printf("|-->");


 p=l1->next;
 while(p!=NULL)
 {
  printf("%d-->",p->data);
  p="p-">next;
 }
 printf("^\n");


 //test ex2.29
 
 //先创建3个顺序表(有序的)
 SqList sa1,sb1,sc1;
 if(!init_sqlist(&sa1))
 {
  printf("init sa1 error\n");
  return 1;
 }
 if(!init_sqlist(&sb1))
 {
  printf("init sb1 error\n");
  return 1;
 }


 if(!init_sqlist(&sc1))
 {
  printf("init sc1 error\n");
  return 1;
 }


 for(i=0;i<16;i++)
 {
  sa1.base[i++]=24+i*2;
  sa1.base=22+i*2;
 }
 
 sa1.length=16;
 printf("sa1 hold:\n");
 for(i=0;i<sa1.length;i++)
 {
  printf("%d\t",sa1.base);
 }
 printf("\n");


 for(i=0;i<26;i++)
 {
  sb1.base[i++]=16+i*2;
  sb1.base=14+i*2;
 }
 
 sb1.length=26;
 printf("sb1 hold:\n");
 for(i=0;i<sb1.length;i++)
 {
  printf("%d\t",sb1.base);
 }
 printf("\n");


 for(i=0;i<60;i++)
 {
  sc1.base=10+i;
 }
 sc1.length=60;
 printf("sc1 hold:\n");
 for(i=0;i<sc1.length;i++)
 {
  printf("%d\t",sc1.base);
 }
 printf("\n");


 delete_sqlist(&sc1,&sb1,&sa1);
 printf("after delete sqlist, result is :\n");
 for(i=0;i<sc1.length;i++)
 {
  printf("%d\t",sc1.base);
 }
 printf("\n");


 //test ex2.30
 LinkList list1,list2,list3;
 if(!create_list(&list1))
 {
 printf("create list1 error\n");
 return 1;
 }
 if(!create_list(&list2))
 {
  printf("create list2 error\n");
 return 1;
 }
 
 if(!create_list(&list3))
 {
 printf("create list3 error\n");
 return 1;
 }


  if(!insert_list(list1,0,98))
 {
  printf("insert list error\n");
  return 1;
 }
 if(!insert_list(list2,0,123))
 {
  printf("insert list error\n");
  return 1;
 }
 if(!insert_list(list3,0,200))
 {
  printf("insert list error\n");
  return 1;
 }
 for(i=1;i<20;i++)
 {
  if(!insert_list(list1,i,50+i))
  {
   printf("insert list error\n");
   return 1;
  }
 }
 printf("list1 now hold the following data:\n");
 printf("|-->");
 p=list1->next;
 while(p!=NULL)
 {
  printf("%d-->",p->data);
  p="p-">next;
 }
 printf("^\n");


 for(i=1;i<10;i++)
 {
  if(!insert_list(list2,i,54+i))
  {
   printf("insert list error\n");
   return 1;
  }
 }
 printf("list2 now hold the following data:\n");
 printf("|-->");
 p=list2->next;
 while(p!=NULL)
 {
  printf("%d-->",p->data);
  p="p-">next;
 }
 printf("^\n");


 for(i=1;i<50;i++)
 {
  if(!insert_list(list3,i,30+i))
  {
   printf("insert list error\n");
   return 1;
  }
 }
 printf("list3 now hold the following data:\n");
 printf("|-->");
 p=list3->next;
 while(p!=NULL)
 {
  printf("%d-->",p->data);
  p="p-">next;
 }
 printf("^\n");


 delete_linklist(list3,list2,list1);
 printf("after delete linklist, result is:\n");
 p=list3->next;
while(p!=NULL)
 {
  printf("%d-->",p->data);
  p="p-">next;
 }
 printf("^\n");
 return 0;
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条