#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define Elem int
#define status int
#define ok 1
#define no 0
#define list_int_size 100
#define listincrement 100
Elem * newbase,*p,*q;
typedef struct List{
int length;//长度
int listlength;//存储容量
Elem * elem;//数组指针
};
//顺序表的创建初始化
status init_list(List &l){
l.elem=(Elem *)malloc(list_int_size*sizeof(Elem));//分配存储空间
if(!l.elem) exit(no);//存储空间失败
l.length=0;
l.listlength=list_int_size;
return ok;
}
//顺序表的插入
status list_insert(List &l,int i,Elem e){
if(i<1||i>l.length+1) return no;
if(l.length>l.listlength)//如果存储空间不够
{
newbase=(Elem *)realloc(l.elem,(l.listlength+listincrement)*sizeof(Elem));
if(!newbase) exit(no);
l.elem=newbase;//新的基地址
l.listlength+=listincrement;
}
q=&(l.elem[i-1]);
for(p=&(l.elem[l.length-1]);p>=q;p--){
*(p+1)=*p;
}
*q=e;
l.length++;
return ok;
}
//顺序表的删除
status list_delete(List &l,int i){
if(i<0||i>l.length) return no;
q=&(l.elem[l.length-1]);
int e;
e=l.elem[i-1];
for(p=&(l.elem[i-1]);p<=q;p++){
*p=*(p+1);
}
l.length--;
return ok;
}
//顺序表的修改
status list_modify(List &la,int i,Elem e){
if(i<0||i>la.length) return no;
la.elem[i-1]=e;
return 1;
}
//顺序表的查找
status list_find(List la,Elem e){
for(int i=0;i<la.length;i++){
if(la.elem[i]==e)
return i+1;
}
return no;
}
//顺序表的合并,la,lb
void merge_list(List &la,List lb){
for(int i=0;i<la.length;i++){
for(int j=0;j<lb.length;j++){
// cout<<list_find(la,lb.elem[j])<<endl;
if(list_find(la,lb.elem[j])==0){//如果la中不含lb中的某个元素,则将该元素插入到la中
list_insert(la,la.length+1,lb.elem[j]);
}
}
}
}
//顺序表的差 A-B
void list_cha(List &A,List B,List &C){
for(int i=0;i<A.length;i++){
if(list_find(B,A.elem[i])==0){
list_insert(C,C.length+1,A.elem[i]);
}
}
}
//顺序表的交
void list_jiao(List &la,List lb,List &lc){
for(int i=0;i<la.length;i++){
for(int j=0;j<lb.length;j++){
//if(list_find(la,lb.elem[j])==1){
if(la.elem[i]==lb.elem[j])
list_insert(lc,lc.length+1,lb.elem[j]);
}
}
}
//顺序表的显示
void show(List L){
int k;
for(int i=0;i<L.length;i++)
cout<<L.elem[i]<<" ";
cout<<endl;
}
//顺序表的释放
void list_destroy(List &l){
free(l.elem);
l.length=0;
}
int main(){
List L,la,lb,lc,ld,le;
init_list(la);
init_list(lb);
init_list(lc);
init_list(ld);
init_list(le);
for(int i=0;i<10;i++){
la.elem[i]=i;
lb.elem[i]=i+4;
ld.elem[i]=i;
le.elem[i]=i;
}
la.length=5;
lb.length=5;
ld.length=5;
le.length=5;
lc.length=0;
int i,res,temp,a,b,c,e,m,n,flags;
flags=-1;
while(flags!=0)
{
cout<<"请选择:";
cout<<"1. 建立顺序表 2. 输入数据 3. 查找 4. 插入 5. 删除 6.修改数据 7. 输出数据 8.输出la和lb的数据 9.la和lb的并集 10.la和lb的交集 11.la和lb的差集 0. 退出"<<endl;
cin>>flags;
switch(flags)
{
case 1:
if(init_list(L)) //创建顺序表
cout<<"成功建立顺序表\n\n";
else
cout<<"顺序表建立失败\n\n";
break;
case 2: //输入10个数
cout<<"请输入5个不同的数:\n";
for(i=0;i<5;i++)
cin>>L.elem[i];
L.length=5;
cout<<endl;
break;
case 3: //顺序表的查找
cout<<"请输入所要查找的数:";
cin>>e; //输入e,代表所要查找的数值
temp=list_find(L,e);
if(temp!=0)
cout<<e<<" 是第 "<<temp<<"个数.\n\n";
else
cout<<"ld查找失败!没有这样的数\n\n";
break;
case 4: //顺序表的插入
cout<<"请输入两个数,分别代表插入的位置和插入数值:";
cin>>a>>b; //输入a和b,a代表插入的位置,b代表插入的数值
if(list_insert(L,a,b))
cout<<"插入成功.\n\n";
else
cout<<"I插入失败.\n\n";
break;
case 5: //顺序表的删除
cout<<"请输入所要删除的数的位置:";
cin>>c;
//输入c,代表要删除数的位置
if(list_delete(L,c))
cout<<"删除成功"<<endl;
else
cout<<"删除失败.\n\n";
break;
case 6:
cout<<"输入修改的位置和修改成的值:";
cin>>m>>n;
list_modify(L,m,n);
break;
case 7:
show(L);
break;
case 8:
cout<<"第一个顺序表为:";
show(ld);
cout<<"第二个顺序表为:";
show(lb);
break;
case 9:
merge_list(la,lb);
cout<<"la和lb的并集:";
show(la);
break;
case 10:
list_jiao(ld,lb,lc);
cout<<"la和lb的交集:";
show(lc);
list_destroy(lc);
lc.length=0;
break;
case 11:
list_cha(le,lb,lc);
cout<<"la和lb的差集:";
show(lc);
list_destroy(lc);
break;
case 0:
return 0;
}
}
}
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define Elem int
#define status int
#define ok 1
#define no 0
#define list_int_size 100
#define listincrement 100
Elem * newbase,*p,*q;
typedef struct List{
int length;//长度
int listlength;//存储容量
Elem * elem;//数组指针
};
//顺序表的创建初始化
status init_list(List &l){
l.elem=(Elem *)malloc(list_int_size*sizeof(Elem));//分配存储空间
if(!l.elem) exit(no);//存储空间失败
l.length=0;
l.listlength=list_int_size;
return ok;
}
//顺序表的插入
status list_insert(List &l,int i,Elem e){
if(i<1||i>l.length+1) return no;
if(l.length>l.listlength)//如果存储空间不够
{
newbase=(Elem *)realloc(l.elem,(l.listlength+listincrement)*sizeof(Elem));
if(!newbase) exit(no);
l.elem=newbase;//新的基地址
l.listlength+=listincrement;
}
q=&(l.elem[i-1]);
for(p=&(l.elem[l.length-1]);p>=q;p--){
*(p+1)=*p;
}
*q=e;
l.length++;
return ok;
}
//顺序表的删除
status list_delete(List &l,int i){
if(i<0||i>l.length) return no;
q=&(l.elem[l.length-1]);
int e;
e=l.elem[i-1];
for(p=&(l.elem[i-1]);p<=q;p++){
*p=*(p+1);
}
l.length--;
return ok;
}
//顺序表的修改
status list_modify(List &la,int i,Elem e){
if(i<0||i>la.length) return no;
la.elem[i-1]=e;
return 1;
}
//顺序表的查找
status list_find(List la,Elem e){
for(int i=0;i<la.length;i++){
if(la.elem[i]==e)
return i+1;
}
return no;
}
//顺序表的合并,la,lb
void merge_list(List &la,List lb){
for(int i=0;i<la.length;i++){
for(int j=0;j<lb.length;j++){
// cout<<list_find(la,lb.elem[j])<<endl;
if(list_find(la,lb.elem[j])==0){//如果la中不含lb中的某个元素,则将该元素插入到la中
list_insert(la,la.length+1,lb.elem[j]);
}
}
}
}
//顺序表的差 A-B
void list_cha(List &A,List B,List &C){
for(int i=0;i<A.length;i++){
if(list_find(B,A.elem[i])==0){
list_insert(C,C.length+1,A.elem[i]);
}
}
}
//顺序表的交
void list_jiao(List &la,List lb,List &lc){
for(int i=0;i<la.length;i++){
for(int j=0;j<lb.length;j++){
//if(list_find(la,lb.elem[j])==1){
if(la.elem[i]==lb.elem[j])
list_insert(lc,lc.length+1,lb.elem[j]);
}
}
}
//顺序表的显示
void show(List L){
int k;
for(int i=0;i<L.length;i++)
cout<<L.elem[i]<<" ";
cout<<endl;
}
//顺序表的释放
void list_destroy(List &l){
free(l.elem);
l.length=0;
}
int main(){
List L,la,lb,lc,ld,le;
init_list(la);
init_list(lb);
init_list(lc);
init_list(ld);
init_list(le);
for(int i=0;i<10;i++){
la.elem[i]=i;
lb.elem[i]=i+4;
ld.elem[i]=i;
le.elem[i]=i;
}
la.length=5;
lb.length=5;
ld.length=5;
le.length=5;
lc.length=0;
int i,res,temp,a,b,c,e,m,n,flags;
flags=-1;
while(flags!=0)
{
cout<<"请选择:";
cout<<"1. 建立顺序表 2. 输入数据 3. 查找 4. 插入 5. 删除 6.修改数据 7. 输出数据 8.输出la和lb的数据 9.la和lb的并集 10.la和lb的交集 11.la和lb的差集 0. 退出"<<endl;
cin>>flags;
switch(flags)
{
case 1:
if(init_list(L)) //创建顺序表
cout<<"成功建立顺序表\n\n";
else
cout<<"顺序表建立失败\n\n";
break;
case 2: //输入10个数
cout<<"请输入5个不同的数:\n";
for(i=0;i<5;i++)
cin>>L.elem[i];
L.length=5;
cout<<endl;
break;
case 3: //顺序表的查找
cout<<"请输入所要查找的数:";
cin>>e; //输入e,代表所要查找的数值
temp=list_find(L,e);
if(temp!=0)
cout<<e<<" 是第 "<<temp<<"个数.\n\n";
else
cout<<"ld查找失败!没有这样的数\n\n";
break;
case 4: //顺序表的插入
cout<<"请输入两个数,分别代表插入的位置和插入数值:";
cin>>a>>b; //输入a和b,a代表插入的位置,b代表插入的数值
if(list_insert(L,a,b))
cout<<"插入成功.\n\n";
else
cout<<"I插入失败.\n\n";
break;
case 5: //顺序表的删除
cout<<"请输入所要删除的数的位置:";
cin>>c;
//输入c,代表要删除数的位置
if(list_delete(L,c))
cout<<"删除成功"<<endl;
else
cout<<"删除失败.\n\n";
break;
case 6:
cout<<"输入修改的位置和修改成的值:";
cin>>m>>n;
list_modify(L,m,n);
break;
case 7:
show(L);
break;
case 8:
cout<<"第一个顺序表为:";
show(ld);
cout<<"第二个顺序表为:";
show(lb);
break;
case 9:
merge_list(la,lb);
cout<<"la和lb的并集:";
show(la);
break;
case 10:
list_jiao(ld,lb,lc);
cout<<"la和lb的交集:";
show(lc);
list_destroy(lc);
lc.length=0;
break;
case 11:
list_cha(le,lb,lc);
cout<<"la和lb的差集:";
show(lc);
list_destroy(lc);
break;
case 0:
return 0;
}
}
}
本文介绍了一个使用C++实现的顺序表的基本操作,包括初始化、插入、删除、查找、修改等,并展示了如何通过这些基本操作来完成集合的并集、交集和差集运算。
180

被折叠的 条评论
为什么被折叠?



