线性表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[]={0,1,4,6,22,56,76,83,99}; int B[]={1,4,6,56,76,83}; int i=0,j=0, //循环因子 k=0, //记录搜索进度 lena,lenb, //数组长度 mov, //命中次数或者说数组左移距离 index; //记录命中后第一个位置 getArrayLen(A,lena); getArrayLen(B,lenb); if(A[0]<=B[lenb-1] && B[0]<=A[lena-1]) //出现重复的边界情况 for(i=0;i<lenb;i++){ //子弹数组 for(mov=0;j<lena;j++){ //靶数组 if(A[j]==B[i]){ mov++; //找着一次就+1,继续找 }else if(mov!=0){ //发现后面没有重复的命中目标,结束查找 break; } } if(mov!=0){ //不等于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=0;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[20]; int num; head=p=(IntNode *) malloc(sizeof(IntNode)); p->next=NULL; while(1){ scanf("%s",&str); if(strcmp(str,"exit")==0){ 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; }
浙公网安备 33010602011771号