用c语言去实现线性表的合并,删除重复(不重新排序)

    科技2025-07-12  12

    用c语言去实现线性表的合并,删除重复(不重新排序)

    老师留了一个作业,有两个集合A和B,设A={7,5,3,11},B={2,6,3},合并后A={7,5,3,11,2,6} 自己没有思路百度了好久,找到的大多都是其他语言的,要不就是直接重新排序的。硬着头皮写出来了,经历了无数次修改,写成了一个小小代码(自己感觉写的一塌糊涂,幸运的是还能运行)。然后发出来了来给大家提供一点微不足道的思路,也算是记录自己学习的一个过程吧。 上代码!

    先来段我自己写的一塌糊涂代码

    #include <stdio.h> #define MAXSIDE 100 void ListOutput(int *a,int *b , int m) { int i, j, k, h = 0, g = 0,c[MAXSIDE]; for (i = 0; *(a + i) != 0 ; i++) { for( j = 0 ; *( b + j ) != 0 ; j++) if(*(a+i)==*(b+j))//比较A和B找到相等项时,把此项在数组b中的位置存到a中 { g=c[h]; h++; break;//跳出循环 } } for( k = 0,h = 0 ; *(a + k) != 0 ; k++) if(k != c[h])//当B里面的值的序号不等于刚刚提取出来的,在A的实际存储长度后,存储B的值 *( b + m + k) = *( a + k ); else h++; } int Listlength(int *a) //返回A实际存储长度 { int m; for( m = 0 ; *(a + m) != 0 ; m++); return m; } int main() { int A[MAXSIDE] = {7,5,3,11},B[MAXSIDE] = {2,6,3} , n , m ; m = Listlength(A) ; ListOutput(B , A , m); for (n = 0; n<6; n++)//循环输出A的值 printf("%d\n", A[n]); return 0; }

    附上运行截图 我感觉我思路挺乱的,功能实现的挺暴力的,如果您有对我的一些建议,非常感谢您可以指出来,让我获得一些您的评价,从中来进行更好地学习。

    下面附上老师的代码(c++)

    老师课后给的标准答案是c++,我跑了一遍,感觉老师的程序兼职太精妙了,c++看不懂的可以查一下简单的运算符,然后看看思路,下面附上!

    #include<iostream> using namespace std; #define MAXSIZE 100 #define OK 1 #define ERROR -1 #define OVERFLOW -2 typedef int Status; typedef struct { int *elem; int length; }SqList; Status InitList_Sq(SqList &L){ // 初始化 L.elem=new int[MAXSIZE]; if(!L.elem) exit(OVERFLOW); L.length=0; return OK; } int GetLength(SqList L) // 求长度 { return (L.length); } int GetElem(SqList L, int i, int &e) // 获取元素值 { if (i<1||i>L.length) return ERROR; e=L.elem[i-1]; return OK; } int LocateELem(SqList L,int e) // 查找 { int i; for (i=0;i< L.length;i++) if (L.elem[i]==e) return i+1; return 0; } Status ListInsert_Sq(SqList &L,int i ,int e) // 第i个元素前插入 { int j; if(i<1 || i>L.length+1) return ERROR; if(L.length==MAXSIZE) return ERROR; for( j=L.length-1;j>=i-1;j--) L.elem[j+1]=L.elem[j]; L.elem[i-1]= e; ++L.length; return OK; } /* Status ListInsert_Sq(SqList &L, int i , int e){ // 第i个元素后插入 int j; if(i<0 || i>L.length) return ERROR; if(L.length==MAXSIZE) return ERROR; for( j=L.length; j>=i+1 ; j--) L.elem[j]=L.elem[j-1]; L.elem[i]= e; ++L.length; return OK; } */ void ListOutput(SqList L) // 输出顺序表的元素值 { int i; for (i = 0; i < L.length; i++) cout << L.elem[i] << " "; cout << endl; } void MergeList(SqList &La, SqList Lb) // 求并集 { int La_len,Lb_len,e; La_len=GetLength(La); Lb_len=GetLength(Lb); for(int i=1;i<=Lb_len;i++) { GetElem(Lb,i,e); if(!LocateELem(La,e)) { ListInsert_Sq(La,++La_len,e); } } } main() { SqList la,lb; // la.elem la.length lb.elem lb.lentgh int a,b,i,e; InitList_Sq(la); InitList_Sq(lb); cout<<"请输入集合A的元素个数:"<<endl; cin>>a; cout<<"请输入集合B的元素个数:"<<endl; cin>>b; cout<<"请输入集合A的各元素值:"<<endl; for(i=1;i<=a;i++) { cin>>e; ListInsert_Sq(la,i,e); // 插入在末尾 } ListOutput(la); cout<<"请输入集合B的各元素值:"<<endl; for(i=1;i<=b;i++) { cin>>e; ListInsert_Sq(lb,i,e); } ListOutput(lb); MergeList(la,lb); ListOutput(la); }

    还是运行截图~

    总结

    1、希望这些代码可以给大家带来帮助 2、希望大佬可以对我的代码指点一下 3、这是我的第一篇博客,希望以后我可以坚持下去

    Processed: 0.010, SQL: 8