已知A,B,C为三个元素值递增有序的线性表,要求对表A如下运算:删去那些既在表B中出现又在表C......
这个是顺序表的,单链表我也有写,在另一个文章
不善于解释,代码在下面,function函数是主要实现的函数,时间复杂度为O(n),希望能帮到你
#include
#include
#include
#define SUCCESS 1
#define FAIL 0
#define Elemtype int
#define SIZE 10
#define EXTERN 1
#define Status int
typedef struct SeqList
{Elemtype *base;int capacity;int size;
}List;Status extern_(List *list);
void initial(List *list);
void push_back(List *list,Elemtype x);
void show(List *list);
void function(List *la,List *lb,List *lc);int main()
{List la,lb,lc;initial(&la);initial(&lb);initial(&lc);printf("构造顺序表a(要显示的链表)(-1 end)\n");int x;while(1){scanf("%d",&x);if(x==-1)break;push_back(&la,x);}printf("这是顺序表a>>>");show(&la);printf("构造顺序表b(要显示的链表)(-1 end)\n");while(1){scanf("%d",&x);if(x==-1)break;push_back(&lb,x);}printf("这是顺序表b>>>");show(&lb);printf("构造顺序表c(要显示的链表)(-1 end)\n");while(1){scanf("%d",&x);if(x==-1)break;push_back(&lc,x);}printf("这是顺序表c>>>");show(&lc);function(&la,&lb,&lc);printf("function后的顺序表a>>>");show(&la);return(1);
}void initial(List *list)
{//本算法的功能是初始化顺序表list//为顺序表初始化大小为十个空间的内存list->base=(Elemtype*)malloc(SIZE*sizeof(Elemtype));assert(list->base!=NULL);list->size=0;list->capacity=SIZE;
}void push_back(List *list ,Elemtype x)
{//本算法的前提是顺序表已经初始化并且内存空间未满//本算法的功能是在顺序表的尾部插入数据元素xif(list->size==list->capacity&&!extern_(list))return;//空间已满list->base[list->size]=x;list->size++;//表长加一
}void show(List *list)
{//本算法的前提是顺序表已经初始化并且顺序表至少有一个元素//本算法的功能是依次显示顺序表中的元素int i;if(list->size==0)return;//表长合法性判断for(i=0;i<list->size;++i)printf("%d ",list->base[i]);printf("\n");
}Status extern_(List *list)
{//本算法的前提是顺序表已经初始化//本算法的功能是增加顺序表的长度,一次增大的长度为EXTERNElemtype *newbase;newbase=(Elemtype*)realloc(list->base,(list->capacity+EXTERN)*sizeof(Elemtype));assert(newbase!=NULL);if(newbase!=NULL)//分配成功{list->base=newbase;list->capacity+=EXTERN;return(SUCCESS);}else{return(FAIL);}
}void function(List *la,List *lb,List *lc)
{//本算法的前提是la,lb,lc中都至少有一个元素//本算法的功能是去掉la中在lb和lc同时出现的元素if(la->size==0 || lb->size==0 || lc->size==0)return;//表长合法性判断int pa,pb,pc,i;pa=0;pb=0;pc=0;//三个指针分别指向顺序表的第一个元素while(pasize && pbsize && pcsize)//三个指针都没有越界{while(pbsize && pcsize && lb->base[pb]!=lc->base[pc])//指针指向的值小的往前移,直到相等{if(lb->base[pb]base[pc])pb++;elsepc++;}if(pbsize && pcsize)//pb和pc指向表中值相同的元素{while(pb!=lb->size-1&&lb->base[pb]==lb->base[pb+1] || lc!=lc->size-1&&lc->base[pc]==lc->base[pc+1])//让pb和pc中分别指向重复出现的元素中的最后一个{if(lb->base[pb]==lb->base[pb+1]) //如果这个元素直接后继相同,就指向这个直接后继pb++;if(lc->base[pc]==lc->base[pc+1])pc++;}while(pasize && la->base[pa]base[pb]) pa++;if(pasize && la->base[pa]==lb->base[pb])//如果在A中找到这个在B和C中重复出现的元素{for(i=pa;isize-1;++i)la->base[i]=la->base[i+1];//给予删除la->size--;//表长减一}else//如果A中不存在这个元素{pb++;pc++;}//pb和pc都同时后移}}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
