线性表A-B

时间:2023-03-09 19:32:03
线性表A-B

1.顺序存储

#include<stdio.h>

/*
设有两个顺序表A和B,且都递增有序,试写一算法,从A中删除与B中相同的那些元素,即求A-B
*/
#define getArrayLen(array,len) len=sizeof(array)/sizeof(array[0]) void main(){
int A[]={,,,,,,,,};
int B[]={,,,,,};
int i=,j=, //循环因子
k=, //记录搜索进度
lena,lenb, //数组长度
mov, //命中次数或者说数组左移距离
index; //记录命中后第一个位置
getArrayLen(A,lena);
getArrayLen(B,lenb);
if(A[]<=B[lenb-] && B[]<=A[lena-]) //出现重复的边界情况
for(i=;i<lenb;i++){ //子弹数组
for(mov=;j<lena;j++){ //靶数组
if(A[j]==B[i]){
mov++; //找着一次就+1,继续找
}else if(mov!=){ //发现后面没有重复的命中目标,结束查找
break;
}
}
if(mov!=){ //不等于0,说明有目标被发现,此时j始终为命中目标的后一个位置
for(index=j;index<lena;index++){ //如果后面还有数据,全部向头部移动
A[index-mov]=A[index];
}
lena-=mov; //A缩小
j-=mov; //j重新定位到未查找的位置
k=j; //k记录进度
}else{
j=k; //没有找着,继续从上一次的进度位置开始下轮查找
} } for(i=;i<lena;i++){
printf("%d ",A[i]);
}
} // 0 22 99 Press any key to continue

2.链式存储

#include<stdio.h>
#include<stdlib.h>
#include<string.h> /*
设有两个链表A和B,且都递增有序,试写一算法,从A中删除与B中相同的那些元素,即求A-B
*/ typedef struct node{
int value;
struct node * next;
} IntNode;
typedef IntNode * Integers;
Integers inputNumArray();//根扰输入创建链表
void destory(Integers);//释放链表内存
void main(void){
Integers A,B;
IntNode *pa,*pb,*p;
printf("请输入数组A(输入exit退出):");
A=inputNumArray();
if(!A->next){
return;
}
printf("请输入数组B(输入exit退出):");
B=inputNumArray(); p=A;
pa=A->next;
pb=B->next;
while(pb){ while(pa){
if(pa->value > pb->value){
break;
}
if(pa->value == pb->value){
p->next=pa->next;
free(pa);
pa=p->next;
}else{
p=pa;
pa=pa->next;
} } pb=pb->next; }
p=A->next;
while(p){
printf("%d ",p->value);
p=p->next;
}
destory(A);
destory(B); }
Integers inputNumArray(){//返回带头结点的数组
IntNode * head,*node,*p;
char str[];
int num;
head=p=(IntNode *) malloc(sizeof(IntNode));
p->next=NULL;
while(){
scanf("%s",&str);
if(strcmp(str,"exit")==){
break;
}
num=atoi(str);//字符串转整型 node=(IntNode *)malloc(sizeof(IntNode));
node->value=num;
node->next=NULL;
p->next=node;
p=node; }
return head;
}
void destory(Integers array){
IntNode * p,*node;
if(!array)return;
p=array;
while(p){
node=p;
p=p->next;
free(node);
}
array=NULL;
}