删除线性表中多余元素
问题:
算法1:由于是顺序表进行删除要进行大量移动,时间复杂度比较大,所以选算法2较好。
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
int listsize;
}Sqlist;
bool Createlist(Sqlist &L,int n);//创建顺序表
void Input(Sqlist &L);//给顺序表赋值
void Output(Sqlist &L);//给顺序表输出
bool LocateElem(Sqlist L,ElemType e);//在新的顺序表中查找是否有这个值
void DeleteElem(Sqlist La,Sqlist &Lb);//删除多余元素(通过建立新表进行往里放)
int main(){
Sqlist La,Lb;
int n=10;
Createlist(La,n);
Input(La);
Output(La);
DeleteElem(La,Lb);
Output(Lb);
}
bool Createlist(Sqlist &L,int n){
L.elem=(ElemType *)malloc(n*sizeof(ElemType));
if(!L.elem) return false;//内存分配失败
L.length=0;
L.listsize=n;
return true;
}
void Input(Sqlist &L){
int n;
ElemType elem;
scanf("%d",&n);
L.length=n;//记录实长(很关键)
for(int i=0;i<n;i++){
scanf("%d",&elem);
L.elem[i]=elem;
}
}
void Output(Sqlist &L){
for(int i=0;i<L.length;i++){
printf("%d",L.elem[i]);
printf(" ");
}
printf("\n");
}
bool LocateElem(Sqlist L,ElemType e){
int flag=0;
for(int i=0;i<L.length;i++){
if(L.elem[i]==e){
flag=1;
return false;
}
}
if(!flag)
return true;
}
void DeleteElem(Sqlist La,Sqlist &Lb){
Createlist(Lb,La.length);
int k=1;
Lb.length=1;
Lb.elem[0]=La.elem[0];
for(int i=1;i<La.length;i++){
if(!LocateElem(Lb,La.elem[i]))
continue;
else{
Lb.elem[k]=La.elem[i];
k++;
Lb.length++;
}
}
}