数据结构与算法:线性表(源码)!
离期末考试还有一个多月,打算系统复习一下数据结构。因为这段时间投入在数据结构上的时间基本没有。
所以掌握十分不牢固。现在贴段程序。希望园子里的朋友可以帮我解决一下指针的使用出的读写错误。
这是源码:
#include <iostream>
#define Max 100
using namespace std;
typedef int datatype;
/*线性表结构*/
typedef struct SeqList{
datatype data[Max];
int last;
} SeqList;
/*初始化*/
SeqList * init_SeqList()
{
SeqList *L; int i;
L=new SeqList;
cout<<"请输入顺序表的长度"<<endl;
cin>>L->last;
L->last--;
cout<<"请输入顺序表的内容"<<endl;
for(i=0;i<=L->last;i++)
cin>>L->data[i];
return L;
}
/*读取*/
void Print(SeqList *L)
{
int i;
cout<<"顺序表内容为:"<<endl;
for(i=0;i<=L->last;i++)
cout<<L->data[i]<<endl;
}
/*从小到大排序*/
void Part(SeqList *L)
{
int i,j;
datatype t;
for(j=0;j<=L->last;j++)
{ for (i=0;i<L->last-j;i++)
if (L->data[i]>L->data[i+1])
{ t=L->data[i];
L->data[i]=L->data[i+1];
L->data[i+1]=t;}
}
}
/*插入*/
int Insert(SeqList *L,int i,datatype x){
int j;
if(L->last>Max-1){
cout<<"表满"<<endl;
return -1;
}
if(i<1||i>L->last+2){
cout<<"插入位置错误!插入失败"<<endl;
return 0;
}
for(j=L->last;j>=i-1;j--)
L->data[j+1]=L->data[j];
L->data[i-1]=x;
L->last++;
return 1;
}
/*删除*/
int Delete(SeqList *L,int i){
int j;
if(i<1||i>L->last+1){
cout<<"不存在第i个元素"<<endl;
return 0;
}
for(j=i;j<=L->last;j++)
L->data[j-1]=L->data[j];
L->last--;
return 0;
}
/*按值查找*/
int Location(SeqList *L,datatype x){
int i;
i=0;
while(i<=L->last&&L->data[i]!=x){
i++;
if(i>L->last){
return -1;
}
}
return i+1;
}
/*线性表合并*/
void Merge(SeqList *A,SeqList *B,SeqList *C){
int i,j,k;
i=0;
j=0;
k=0;
while(i<=A->last && j<=B->last)
if(A->data[i]<B->data[j])
C->data[k++]=A->data[i++];
else
C->data[k++]=B->data[j++];
while(i<=A->last)
C->data[k++]=A->data[i++];
while(j<=B->last)
C->data[k++]=B->data[j++];
C->last=k;
}
/*两个线性表的比较*/
int Compare(int A[],int B[],int m,int n){
int i,j,AS[100],BS[100],ms,ns;
i=0;
ms=ns=0;
while(i<=m && i<=n && A[i]==B[i])
i++;
for(j=i;j<m;j++){
AS[j=i]=A[j];
ms++;
}
for(j=i;j<n;j++){
BS[j-i]=B[j];
ns++;
}
if(ms==ns&&ms==0)
return 0;
else
if(ms==0&&ns>0||ms>0&&ns>0&&AS[0]<BS[0])
return -1;
else
return 1;
}
/*线性表转化成数组*/
int Change(SeqList *L){
int i;
int a[L->last];
for(i=0;i<L->last;i++)
a[i]=L->data[i];
return a[L->last];
}
/*主函数*/
int main()
{
int into;
int del;
int result;
int a[100];
int b[100];
datatype find;
datatype num;
SeqList *L;
SeqList *L2;
SeqList *L3;
L=init_SeqList();
cout<<"您输入的";
Print(L);
Part(L);
cout<<"从小到大排序后的";
Print(L);
cout<<"请输入您要插入的数:"<<endl;
cin>>num;
cout<<"请输入您要插入的位置:"<<endl;
cin>>into;
Insert(L,into,num);
cout<<"插入后的";
Print(L);
cout<<"请输入您要删除的元素位置:"<<endl;
cin>>del;
Delete(L,del);
Print(L);
cout<<"请输入您要查找的数"<<endl;
cin>>find;
cout<<"您查找的数在第"<<Location(L,find)<<"位"<<endl;
cout<<"输入第二个线性表:"<<endl;
L2=init_SeqList();
cout<<"您输入的";
Print(L2);
Part(L);
Part(L2);
Merge(L,L2,L3);
cout<<"两个从小到大线性表合并后的";
Print(L3);
cout<<"线性表转化成数组"<<endl;
a[100]=Change(L);
b[100]=Change(L2);
int *x;
int *y;
x=&a[100];
y=&b[100];
cout<<"两个线性表的比较"<<endl;
result=Compare(x,y,L->last,L2->last);
if(result=1){
cout<<"A线性表大于B线性表"<<endl;
}else if(result=0){
cout<<"A线性表等于B线性表"<<endl;
}else if(result=-1){
cout<<"A线性表小于B线性表"<<endl;
}
return 0;
}
#define Max 100
using namespace std;
typedef int datatype;
/*线性表结构*/
typedef struct SeqList{
datatype data[Max];
int last;
} SeqList;
/*初始化*/
SeqList * init_SeqList()
{
SeqList *L; int i;
L=new SeqList;
cout<<"请输入顺序表的长度"<<endl;
cin>>L->last;
L->last--;
cout<<"请输入顺序表的内容"<<endl;
for(i=0;i<=L->last;i++)
cin>>L->data[i];
return L;
}
/*读取*/
void Print(SeqList *L)
{
int i;
cout<<"顺序表内容为:"<<endl;
for(i=0;i<=L->last;i++)
cout<<L->data[i]<<endl;
}
/*从小到大排序*/
void Part(SeqList *L)
{
int i,j;
datatype t;
for(j=0;j<=L->last;j++)
{ for (i=0;i<L->last-j;i++)
if (L->data[i]>L->data[i+1])
{ t=L->data[i];
L->data[i]=L->data[i+1];
L->data[i+1]=t;}
}
}
/*插入*/
int Insert(SeqList *L,int i,datatype x){
int j;
if(L->last>Max-1){
cout<<"表满"<<endl;
return -1;
}
if(i<1||i>L->last+2){
cout<<"插入位置错误!插入失败"<<endl;
return 0;
}
for(j=L->last;j>=i-1;j--)
L->data[j+1]=L->data[j];
L->data[i-1]=x;
L->last++;
return 1;
}
/*删除*/
int Delete(SeqList *L,int i){
int j;
if(i<1||i>L->last+1){
cout<<"不存在第i个元素"<<endl;
return 0;
}
for(j=i;j<=L->last;j++)
L->data[j-1]=L->data[j];
L->last--;
return 0;
}
/*按值查找*/
int Location(SeqList *L,datatype x){
int i;
i=0;
while(i<=L->last&&L->data[i]!=x){
i++;
if(i>L->last){
return -1;
}
}
return i+1;
}
/*线性表合并*/
void Merge(SeqList *A,SeqList *B,SeqList *C){
int i,j,k;
i=0;
j=0;
k=0;
while(i<=A->last && j<=B->last)
if(A->data[i]<B->data[j])
C->data[k++]=A->data[i++];
else
C->data[k++]=B->data[j++];
while(i<=A->last)
C->data[k++]=A->data[i++];
while(j<=B->last)
C->data[k++]=B->data[j++];
C->last=k;
}
/*两个线性表的比较*/
int Compare(int A[],int B[],int m,int n){
int i,j,AS[100],BS[100],ms,ns;
i=0;
ms=ns=0;
while(i<=m && i<=n && A[i]==B[i])
i++;
for(j=i;j<m;j++){
AS[j=i]=A[j];
ms++;
}
for(j=i;j<n;j++){
BS[j-i]=B[j];
ns++;
}
if(ms==ns&&ms==0)
return 0;
else
if(ms==0&&ns>0||ms>0&&ns>0&&AS[0]<BS[0])
return -1;
else
return 1;
}
/*线性表转化成数组*/
int Change(SeqList *L){
int i;
int a[L->last];
for(i=0;i<L->last;i++)
a[i]=L->data[i];
return a[L->last];
}
/*主函数*/
int main()
{
int into;
int del;
int result;
int a[100];
int b[100];
datatype find;
datatype num;
SeqList *L;
SeqList *L2;
SeqList *L3;
L=init_SeqList();
cout<<"您输入的";
Print(L);
Part(L);
cout<<"从小到大排序后的";
Print(L);
cout<<"请输入您要插入的数:"<<endl;
cin>>num;
cout<<"请输入您要插入的位置:"<<endl;
cin>>into;
Insert(L,into,num);
cout<<"插入后的";
Print(L);
cout<<"请输入您要删除的元素位置:"<<endl;
cin>>del;
Delete(L,del);
Print(L);
cout<<"请输入您要查找的数"<<endl;
cin>>find;
cout<<"您查找的数在第"<<Location(L,find)<<"位"<<endl;
cout<<"输入第二个线性表:"<<endl;
L2=init_SeqList();
cout<<"您输入的";
Print(L2);
Part(L);
Part(L2);
Merge(L,L2,L3);
cout<<"两个从小到大线性表合并后的";
Print(L3);
cout<<"线性表转化成数组"<<endl;
a[100]=Change(L);
b[100]=Change(L2);
int *x;
int *y;
x=&a[100];
y=&b[100];
cout<<"两个线性表的比较"<<endl;
result=Compare(x,y,L->last,L2->last);
if(result=1){
cout<<"A线性表大于B线性表"<<endl;
}else if(result=0){
cout<<"A线性表等于B线性表"<<endl;
}else if(result=-1){
cout<<"A线性表小于B线性表"<<endl;
}
return 0;
}
编译可以通过,但是合并线性表这里有问题,而且两个线性表的比较也不成功,希望朋友可以帮忙看看。谢谢!
基础不牢,见笑了。
作者:Steven(Steven's Think out)
出处:http://shiyangxt.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。