順序表的增刪改查操作
阿新 • • 發佈:2019-01-23
#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;
}
}
}