线性表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;
}

 

posted on 2014-08-27 23:31  流.云  阅读(394)  评论(0)    收藏  举报

导航