这是第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;
}
文章评论(0条评论)
登录后参与讨论