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

2008-3-31 21:13 4472 6 6 分类: 软件与OS
这章题目比较多,这是第一部分,后续等我有时间再做.

 

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

#define LIST_INIT_SIZE  100
#define LISTINCREMENT   10

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

//初始化顺序表
bool init_sqlist(SqList *L)
{
 if((L->elem=(int *)malloc(sizeof(int)*LIST_INIT_SIZE))==NULL)
  return false;
 L->length=0;
 L->listsize=LIST_INIT_SIZE;
 return true;
}

//习题2.10
bool delete_slistk(SqList *L,int i,int k)
{
 int j;
 if(i<0||k<0||i+k>L->length)
  return false;
 for(j=i+k;j<L->length;j++)
 {
  L->elem[j-k]=L->elem[j];
 }
 L->length-=k;
 return true;
}

//习题2.11
bool insert_increment_list(SqList *L,int x)
{
 int i;
 if(L->length>=L->listsize)
  return false;
 for(i=L->length;i>=0;i--)
 {
  if(L->elem<x)
  {
   L->elem[i+1]=x;
   return true;
  }
  L->elem[i+1]=L->elem;
 }
 L->length+=1;
 return true;
}

//习题2.12
int compare_sqlist(SqList *La, SqList* Lb)
{
 int i =0;
 while((i<La->length)&&(i<Lb->length))
 {
  if(La->elem>Lb->elem)
   return 1;
  if(La->elem<Lb->elem)
   return -1;
  i++;
 }
 if(i==La->length)
 {
  if(i==Lb->length)
   return 0;
  return -1;
 }
 return 1;
}

typedef struct LNode{
 int data;
 struct LNode *next;
}LNode, *LinkList;
//初始化链表
bool init_linklist(LinkList *l)
{
 if((*l=(LinkList)malloc(sizeof(LNode)))==NULL)
  return false;
 (*l)->next=NULL;
 return true;
}
//插入链表头
bool insert_linklist_head(LinkList l,int x)
{
 LNode *pNode;
 if((pNode=(LNode *)malloc(sizeof(LNode)))==NULL)
 {
  return false;
 }
 pNode->data=x;
 pNode->next=l->next;
 l->next=pNode;
 return true;
}


//习题2.13
int locate(LinkList l,int x)
{
 int i="0";
/* 
 LinkList p="l";
 while(p->next!=NULL)
 {
  i++;
  p=p->next;
  if(p->data==x)
   return i;
 }
 return 0;//没找到
 */
 while(l->next!=NULL)
 {
  i++;
  l=l->next;
  if(l->data==x)
   return i;
 }
 return 0;//没找到
}

//习题2.15
LinkList *linklistcat(LinkList La, LinkList Lb)
{
 LinkList *p;
 if((p=(LinkList*)malloc(sizeof(LinkList)))==NULL)
  return NULL;

 *p=La;
 while(La->next!=NULL)
  La=La->next;
 La->next=Lb->next;
 return p;
}

//习题2.16
bool DeleteAndInsertSub(LinkList La, LinkList Lb,int i,int j,int len)
{
 if(i<=0||j<=0||len<0)
  return false;
 LNode *p=La;
 int k="1";
 while((k<i)&&(p->next!=NULL))
 {
  p=p->next;
  k++;
 }
 LNode *s=p;
 k=0;
 while((k<len)&&(s->next!=NULL))
 {
  s=s->next;
  k++;
 }

 LNode *q=Lb;
 k=1;
 while((k<j)&&(q->next!=NULL))
 {
  q=q->next;
  k++;
 }
 //插入Lb
 LNode *tmp=s->next;
 s->next=q->next;
 q->next=p->next;

 //从La删除这些节点
 p->next=tmp;

 return true;
}

//习题2.17
bool insert_list(LinkList *l,int i,int x)
{
 int j="1";
 LinkList p;
 if(*l==NULL&&i<1)
 {
  p=(LinkList)malloc(sizeof(LNode));
  if(p==NULL)
   return false;
  p->next=NULL;
  p->data=x;
  *l=p;
  return true;
 }
  
 p=*l;
 while((j<i-1)&&(p->next!=NULL))
 {
  p=p->next;
  j++;
 }
 if(j<i-1)
  return false;

 LNode *pNode=(LinkList)malloc(sizeof(LNode));
 if(pNode==NULL)
  return false;
 pNode->data=x;
 pNode->next=p->next;
 p->next=pNode;
 return true;
}

//习题2.19
bool delete_range(LinkList l,int mink,int maxk) 
{
 if(mink>maxk)
  return false;
 LinkList p="l";
 LinkList begin,end;
 while((p!=NULL)&&(p->data<mink))
 {
  begin=p;
  p=p->next;
 }
 
 while((p!=NULL)&&(p->data<=maxk))
 {
  p=p->next;
 }
 end=p;
 if(begin==NULL)
  return false;
 begin->next=end;
 return true;
}

//习题2.21:对顺序表就地倒置
void reverse_sqlist(SqList *L)
{
 int tmp;
 int i="0";
 while(i<L->length-1-i)
 {
  tmp=L->elem;
  L->elem=L->elem[L->length-1-i];
  L->elem[L->length-i]=tmp;
  i++;
 }
}

//习题2.22:对链表就地倒置
void reverse_linklist(LinkList L)
{
 LinkList s,p,q,tmp;
 s=NULL;
 p=L->next;
 q=p->next;
 while(q!=NULL)
 {
  p->next=s;
  s=p;
  tmp=q->next;
  q->next=p;
  p=q;
  q=tmp;
 }
 L->next=p;
}

int main(int argc, char* argv[])
{
 //test ex2.10
 SqList list;
 int i;
 if(!init_sqlist(&list))
 {
  printf("init sqlist error\n");
  return 1;
 }
 for(i=0;i<LIST_INIT_SIZE;i++)
 {
  list.elem=i;
 }
 list.length=LIST_INIT_SIZE;
 printf("before delete, the list hold the following data:\n");
 for(i=0;i<LIST_INIT_SIZE;i++)
 {
  printf("%d\t",list.elem);
 }
 printf("\n");
 if(!delete_slistk(&list,10,20))
 {
  printf("delete error\n");
  return 1;
 }
 printf("after delete, the list hold the following data:\n");
 for(i=0;i<list.length;i++)
 {
  printf("%d\t",list.elem);
 }
 printf("\n");
 
 //test ex 2.11
 int x="37";
 if(!insert_increment_list(&list,x))
 {
  printf("insert error\n");
  return 1;
 }
 printf("after insert, the list hold the following data:\n");
 for(i=0;i<list.length;i++)
 {
  printf("%d\t",list.elem);
 }
 printf("\n");

 //test ex2.12
 SqList La,Lb;
 if(!init_sqlist(&La))
 {
  printf("init sqlist error\n");
  return 1;
 }
 
 if(!init_sqlist(&Lb))
 {
  printf("init sqlist error\n");
  return 1;
 }
 
 for(i=0;i<20;i++)
 {
  La.elem=0x20+i;
 }
 La.length=20;
 for(i=0;i<20;i++)
 {
  Lb.elem=0x20+i;
 }
 Lb.length=20;
 int ret="compare"_sqlist(&La,&Lb);
 switch(ret)
 {
 case 0:
  printf("La=Lb\n");
  break;
 case 1:
  printf("La>Lb\n");
  break;
 case -1:
  printf("La<Lb\n");
  break;
 default:
  printf("compare error\n");
  break;
 }

 //test ex2.13
 LinkList llist,pa;
 if(!init_linklist(&llist))
 {
  printf("init linklist error\n");
  return 1;
 }
 for(i=0;i<14;i++)
 {
  if(!insert_linklist_head(llist,0x10+i))
  {
   printf("insert linklist error\n");
   return 1;
  }
 }
 printf("Now link list hold:\n");
 pa=llist->next;
 printf("|-->");
 while(pa->next!=NULL)
 {
  printf("%d-->",pa->data);
  pa=pa->next;
 }
 printf("%d-->",pa->data);
 printf("^\n");
 int k="24";
 i=locate(llist,k);
 printf("%d locate in %d address\n",k,i);
 //printf("%d\n",llist->next->data);

 //test ex2.15
 LinkList llist1;
 if(!init_linklist(&llist1))
 {
  printf("init linklist error\n");
  return 1;
 }
 for(i=0;i<14;i++)
 {
  if(!insert_linklist_head(llist1,0x70+i))
  {
   printf("insert linklist error\n");
   return 1;
  }
 }
 printf("Now link list hold:\n");
 pa=llist1->next;
 printf("|-->");
 while(pa->next!=NULL)
 {
  printf("%d-->",pa->data);
  pa=pa->next;
 }
 printf("%d-->",pa->data);
 printf("^\n");
 //now 连接
 LinkList *plc=linklistcat(llist,llist1);
 if(plc==NULL)
 {
  printf("cat linklist error\n");
  return 1;
 }
 printf("after cat............\n");
 pa=(*plc)->next;
 printf("|-->");
 while(pa->next!=NULL)
 {
  printf("%d-->",pa->data);
  pa=pa->next;
 }
 printf("%d-->",pa->data);
 printf("^\n");

 //test ex2.16
 if(!DeleteAndInsertSub(llist,llist1,5,7,4))
 {
  printf("delete and insert sub error\n");
  return 1;
 }
 printf("now llist hold:\n");
 pa=llist->next;
 printf("|-->");
 while(pa->next!=NULL)
 {
  printf("%d-->",pa->data);
  pa=pa->next;
 }
 printf("%d-->",pa->data);
 printf("^\n");

 printf("llist1 now hold:\n");
 pa=llist1->next;
 printf("|-->");
 while(pa->next!=NULL)
 {
  printf("%d-->",pa->data);
  pa=pa->next;
 }
 printf("%d-->",pa->data);
 printf("^\n");

//test ex2.17
 LinkList llist2=NULL;

 //插入第一个元素
 insert_list(&llist2,0,80);
 for(i=0;i<9;i++)
 {
  insert_list(&llist2,i+1,81+i);
 }
 printf("after insert 10 data element, the list hold:\n");
 pa=llist2;
 while(pa->next!=NULL)
 {
  printf("%d-->",pa->data);
  pa=pa->next;
 }
 printf("%d-->^\n",pa->data);

 //test ex2.19
  LinkList llist3;
 if(!init_linklist(&llist3))
 {
  printf("init linklist error\n");
  return 1;
 }
 for(i=0;i<14;i++)
 {
  if(!insert_linklist_head(llist3,90-i))
  {
   printf("insert linklist error\n");
   return 1;
  }
 }
 printf("before delete range link list hold:\n");
 pa=llist3->next;
 printf("|-->");
 while(pa->next!=NULL)
 {
  printf("%d-->",pa->data);
  pa=pa->next;
 }
 printf("%d-->",pa->data);
 printf("^\n");
 if(!delete_range(llist3,80,85))
 {
  printf("delete range error\n");
  return 1;
 }
 printf("after delete range link list hold:\n");
 pa=llist3->next;
 printf("|-->");
 while(pa->next!=NULL)
 {
  printf("%d-->",pa->data);
  pa=pa->next;
 }
 printf("%d-->",pa->data);
 printf("^\n");
 
 //test ex2.21
 printf("------------------------------------------\n");
 printf("before reverse, sqlist hold\n");
 for(i=0;i<list.length;i++)
 {
  printf("%d\t",list.elem);
 }
 printf("\n");
 reverse_sqlist(&list);
 printf("------------------------------------------\n");
 printf("after reverse, sqlist hold\n");
 for(i=0;i<list.length;i++)
 {
  printf("%d\t",list.elem);
 }
 printf("\n");

 //test ex2.22
 printf("------------------------------------------\n");
 printf("before reverse, linklist hold\n");
 pa=llist2->next;
 printf("|-->");
 while(pa->next!=NULL)
 {
  printf("%d-->",pa->data);
  pa=pa->next;
 }
 printf("%d-->",pa->data);
 printf("^\n");
 reverse_linklist(llist2);
 printf("after reverse, linklist hold\n");
 pa=llist2->next;
 printf("|-->");
 while(pa->next!=NULL)
 {
  printf("%d-->",pa->data);
  pa=pa->next;
 }
 printf("%d-->",pa->data);
 printf("^\n");
 return 0;
}

文章评论0条评论)

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