数据结构链表习题2.27,假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表

来源:互联网 发布:数控编程仿真软件 编辑:程序博客网 时间:2024/06/01 08:40

方法:不太好表达,总之先保证a表中的指针不越界,然后依次和b表中的元素比较,如果b表中一个与之相等的元素都没有,那么指针pa指向的值就要删掉,否则向前移动,继续比较a表中的下一个元素。
需要注意的是,每次比较,应该先保证pa指向的指针与前面的值不相同,否则应该删除,代码的注释写得很详细,很简洁,就不多废话了

#include<stdio.h>#include<malloc.h>#include<assert.h>#define SIZE 10#define EXTERN 1#define Elemtype int#define Status#define SUCCESS 1#define FAIL 0typedef struct SeqList{    Elemtype *base;    int capacity;    int size;}List;void initial(List *list);void push_back(List *list,Elemtype x);void show(List *list);Status Extern(List *list);void intersec(List *la,List *lb);int main(){    List la,lb;    int x;    initial(&la);    initial(&lb);    printf("创建顺序表a(-1结束)\n");    while(1)    {        scanf("%d",&x);        if(x==-1)            break;        push_back(&la,x);    }    printf("这是顺序表a>>>");    show(&la);    printf("创建顺序表b(-1结束)\n");    while(1)    {        scanf("%d",&x);        if(x==-1)            break;        push_back(&lb,x);    }    printf("这是顺序表b>>>");    show(&lb);    printf("取得交集后的顺序表>>>");    intersec(&la,&lb);    show(&la);    return(1);}void initial(List *list){//本算法的功能是初始化顺序表list    list->base=(Elemtype*)malloc(SIZE*sizeof(Elemtype));//分配初始空间    assert(list->base!=NULL);    list->capacity=SIZE;//容量为10    list->size=0;//表长为0}void push_back(List *list,Elemtype x){//本算法的前提是顺序表已经初始化并且内存空间还没有满    //本算法的功能是在顺序表的尾部插入一个数值x    if(list->size==list->capacity&&!Extern(list))        return;//内存空间已满    list->base[list->size]=x;    list->size++;//表长加一}void show(List *list){//本算法的前提是顺序表已经初始化并且至少有一个元素    //本算法的功能是依次显示表中的元素    if(list->size==0)        return;//表长合法性判断    for(int i=0;i<list->size;++i)        printf("%d ",list->base[i]);    printf("\n");}Status Extern(List *list){//本算法的前提是顺序表已经存在    //本算法的功能是扩充顺序表的内存空间    Elemtype *newbase;    newbase=(Elemtype*)realloc(list->base,(list->capacity+EXTERN)*sizeof(Elemtype));    if(newbase)//如果扩充成功    {        list->base=newbase;        list->capacity+=EXTERN;        return(SUCCESS);    }    else    {        return(FAIL);    }}void intersec(List *la,List *lb){//本算法的前提是顺序表a和b中的元素按值递增    //本算法的功能是求顺序表a和顺序表b的交集,并且交集C没有重复的元素    //交集C存放到顺序表a中    int pa=0,pb=0;//pa和pb分别指向顺序表la和lb中第一个元素    while(pa<la->size)//表a还没有遍历完    {        if(pa==0 || pa!=0&&la->base[pa]!=la->base[pa-1])//如果不是pa指向第一个或者pa指向的元素和前面的不相同        {            while(pb<lb->size && lb->base[pb]<la->base[pa])                pb++;            if(pb<lb->size && lb->base[pb]==la->base[pa])//b中有和a中相同的元素,则保留a中这个元素            {                pa++;            }            else//如果没有,则这个元素多余            {                for(int i=pa;i<la->size-1;++i)                    la->base[i]=la->base[i+1];                la->size--;//表长减一            }        }        else        {            for(int i=pa;i<la->size-1;++i)                la->base[i]=la->base[i+1];            la->size--;        }    }}
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 发快递忘了单号怎么办 国际物流查不到物流怎么办 纸币上印邪教该怎么办 钥匙掉到电梯缝里怎么办 汽车电子钥匙铜线折一根怎么办 防盗门的锁不好开怎么办 同学帮刷饭卡说不用还钱了怎么办 em231电源指示灯不亮怎么办 运行广联达卡住怎么办 马桶被粪便(大便)堵了怎么办 子宫壁厚12mm怎么办 管子太多每次洗澡都是冷水怎么办 热水冷水装反了怎么办 大树被高锰酸钾灌溉了怎么办会死吗 防盗门门被锁了怎么办 门被里面反锁了怎么办 门里面被锁了怎么办 被锁在门里怎么办 门锁住了没钥匙怎么办 车被别人锁住了怎么办 汽车轱辘被锁了怎么办 小车轮胎被锁了怎么办 国防光缆无明显标识被挖断怎么办 临工210挖掘机柴油进气怎么办 汽车抛光蜡干了怎么办 洗碗铁丝球吃了怎么办 牙套铁丝吃肚子怎么办 小铁丝吃到肚子怎么办 绿色抛光膏干了怎么办 不锈钢被盐酸弄黑了怎么办 不锈钢被草酸洗了怎么办 不锈钢洗菜盆被草酸腐蚀了怎么办 汽油发电机加了柴油怎么办 装载机发动机加入齿轮油怎么办 印尼的FromE错了怎么办 寄快递被弄坏了怎么办 福田口岸手表被扣怎么办? 网页显示与服务器连接失败怎么办 唯品会中发货无法清关怎么办 国际快递被海关扣了怎么办 我想开一家物流公司手续怎么办?