10.线性表之数组的基本操作

2015年10月31号--------------------------------

今天星期六,我回家了。家里比学校冷多了。现在我坐在家里的桌子前写下今天的博客!如果你想做些什么事的话,最好快点。因为时间真的很吝啬,但是我脑子比较笨,学东西比较慢。但是我有一个缺点,就是再不行,我也相信,事在人为。后来居上嘛。我有一个有点,那就是能够坚持!大笑


好,闲话不再多说,今天带来的是线性表的另外一种线性存储格式:下面我将实现基本操作的完整代码块张贴如下:

// 线性表.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include <stdio.h>
#include "iostream.h"
#include "stdlib.h"
typedef int DT;//注意不是#define


#define SIZE 10
#define FALSE 0
#define TRUE 1
typedef struct
{
DT data[SIZE];
int length;
}Seqlist;


void Init(Seqlist &L,int n);//建立线性表
void Output(Seqlist L);//输出线性表
void Getdata(Seqlist L,int i,DT &a);//取出指定位置元素
int Insert(Seqlist &L,int p,DT bb);//指定位置插入指定值
int Del(Seqlist &L,int p,int &a);//删除指定位置
void MergeList(Seqlist L,Seqlist LB,Seqlist &LC);//合并两个有序线性表
void Unon(Seqlist &LA,Seqlist &LB);//合并两个集合
int ListLength(Seqlist L);//长度
int Locate(Seqlist LA,int n);//判断n是否属于LA
void Show(Seqlist LA);//输出元素


void Init(Seqlist &L,int n)//建立线性表
{
for(int i=0;i<n;i++)
cin>>L.data[i];
L.length=n;
}


void Output(Seqlist L)//输出线性表
{
for(int i=0;i<L.length;i++)
cout<<L.data[i]<<" ";
}




void Getdata(Seqlist L,int i,DT &a)
{
if(i<1||i>L.length) cout<<"ERROR";
else a=L.data[i-1];
}
/*法2
DT Getdata(Seqlist L,int i)//取出对应位置的元素
{
if(i<1||i>L.length) cout<<"ERROR";
else return L.data[i-1];
}*/




int Insert(Seqlist &L,int p,DT bb)//在对应的位置插入元素
{   //合法性检查。a:P值的大小 b:原链表是否已满
//1.后移(i-n);
//2.插入;
//3.length++;
if(p<1||p>L.length+1)
{
cout<<"插入位置不合法";
return FALSE;
}
    if(L.length==SIZE)
{
cout<<"表已满,无法插入!";
return FALSE;
}




    for(int i=L.length;i>=p;i--)//从最后一个到p全往后移一位
L.data[i]=L.data[i-1];
/*Seqlist a,b;
int n=ListLength(L);
a=L+(n-1)*sizeof(DT);
b=L+(p-1)*sizeof(DT);
cout<<a.data<<endl;
cout<<b.data<<endl;
while(a>=b)
{
*(a+1)=*b;
b++;
}*/
L.data[p-1]=bb;
L.length++;
return TRUE;
}






int Del(Seqlist &L,int p,int &a)//删除指定位置的元素
{
//1合法性检查 p值得大小
//移位
//L.length--
    if(p<1||p>L.length)
{
cout<<"删除的位置不合法";
return FALSE;
}
a=L.data[p-1];
for(int i=p;i<L.length;i++)
L.data[i-1]=L.data[i];
L.length--;
return TRUE;
}


void MergeList(Seqlist L,Seqlist LB,Seqlist &LC)//将两个排好序的线性表合成一个表
{
int i,j,k;
i=0;j=0;k=0;
while(i<=L.length-1&&j<=LB.length-1)
if(L.data[i]<=LB.data[j])
{
LC.data[k]=L.data[i];
i++;
k++;
}
else 
{
LC.data[k]=LB.data[j];
j++;k++;
}
while(i<=L.length-1)
{
LC.data[k]=L.data[i];
   k++;i++;
}
while(j<=LB.length-1)
{
LC.data[k]=LB.data[j];
k++;j++;
}
LC.length=L.length+LB.length;
}


void Unon(Seqlist &LA,Seqlist &LB)
{
int i,e;
int La_len=ListLength(LA);
int Lb_len=ListLength(LB);
for(i=0;i<Lb_len;i++)
{
Getdata(LB,i+1,e);//这里注意是i+1
if(!Locate(LA,e))//没有这个元素
Insert(LA,++La_len,e);
}
}


int ListLength(Seqlist L)
{
return L.length;
}


int Locate(Seqlist LA,int n)
{
int i;
for(i=0;i<LA.length;i++)
{
if(n==LA.data[i])
return TRUE;
}
return FALSE;


}
void Show(Seqlist LA)
{
for(int i=0;i<LA.length;i++)
cout<<LA.data[i];
}


int main(int argc, char* argv[])
{
Seqlist La;
Seqlist Lb,Lc;//将两个排序好的表合并成一个表
DT aa;
int n,p;
Menu: cout<<"\t线性表基本操作\n";
cout<<"\t1.Init(La,n);\t2.Getdata(La,p,aa)(两种方式)\n";
cout<<"\t3.Insert(La,p2,bb);\t4.ListLength(La)\n";
cout<<"\t5.Locate(La,p);\t6.Del(La,p3,a)\n";
cout<<"\t7.MergeList(La,Lb,Lc);\t8.Unon(La,Lb);\n";
cout<<"\t9.Show(La);\n";
cout<<"\t请选择:";
while(1)
{
cin>>n;
switch(n)
{
case 1:
cout<<"请输入要输入元素的个数:";//建立线性表
cin>>n;
cout<<"请输入"<<n<<"个数:";
Init(La,n);
system("cls");
goto Menu;
break;
case 2:
cout<<"请输入要取出的元素位置:";//取出元素
cin>>p;
Getdata(La,p,aa);
cout<<"第"<<p<<"个位置的元素是"<<aa;
//cout<<"第"<<p<<"个位置的元素是"<<Getdata(L,p);
system("cls");
goto Menu;
break;
case 3:
cout<<"请输入要插入的元素:";
cin>>aa;
cout<<"请输入要插入的位置:";
cin>>p;
Insert(La,p,aa);
system("cls");
goto Menu;
break;
case 4:
cout<<"长度是:"<< ListLength(La);
system("cls");
goto Menu;
break;
case 5:
cout<<"请输入要查询的数:";
cin>>aa;
if(Locate(La,p))
cout<<"存在!";
else 
cout<<"不存在";
system("cls");
goto Menu;
break;
case 6:
cout<<"请输入要删除元素的位置:";
cin>>p;
Del(La,p,aa);
cout<<"删除的元素为"<<aa;
system("cls");
goto Menu;
break;
case 7:
cout<<"请输入要建立表2的元素个数:";
cin>>n;
cout<<"请输入"<<n<<"个数:";
Init(Lb,n);
MergeList(La,Lb,Lc);
system("cls");
goto Menu;
break;
case 8:
cout<<"请输入要建立表2的元素个数:";
cin>>n;
cout<<"请输入"<<n<<"个数:";
Init(Lb,n);
Unon(La,Lb);//合并之后存储在La中
system("cls");
goto Menu;
break;
case 9:
Show(La);
system("cls");
goto Menu;
break;

}
return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值