您的位置:首页 > 其它

线性表学习笔记 -顺序表实现(1)

2012-11-12 22:46 253 查看
学习内容包括线性表的定义操作,实现(顺序存储和链式存储),以及一些应用。

线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表跟链表只是实现它的一种形式,属于不同层面的关系。

基本操作(顺序存储) 1、创建表。2、顺序表中插入元素。3、顺序表删除元素。4、顺序表中超找元素。5、输出元素

这是我自己最初编写的错误程序。里面概念混乱,运行不成功。

#include <iostream>
#define MaxLen 50
typedef int elemtype;
typedef elemtype sqlist;
int create(sqlist A[] );
int insert(sqlist A[],int n,int i,elemtype x);
int dele(sqlist A[],int n,int i);
int find(sqlist A[],int n,int x);
int output(sqlist A[] ,int n);
using namespace std;
void main()
{
int A;
int n;
n=create(A);
insert(A,n,3,27);
output(A,5);
}

int create(sqlist A[])
{
int i,n;
cin >> n;
for(i=0;i<n;i++)
cin >> A[i];
return n;
}

int insert(sqlist A[],int n,int i,elemtype x) //在第i位置前插入x,若i=0,元素为第一元素,i=n 插入其后
{
int j;
if(i<0||i>n) cout << "wrong";
else
for(j=n-1;j>=i;j--)
{
A[j+1]=A[j];
A[i]=x;
n++;
}
return n;
}

int dele(sqlist A[],int n,int i) //删除第i个元素
{
int j;
if(i<0||i>n) cout << "wrong";
for(j=i;j<n-1;j++)
A[j]=A[j+1];
n--;
return n;
}

int find(sqlist A[],int n,int x)//按值查找,查找x值,返回其位置
{
int i;
while(i<=n&&A[i]!=x) i++;
if(i<n) return 1;
else return 0;
}

void  output(sqlist A[],int n)
{
int i;
for(i=0;i<n;i++)
cout << A[i] << "," ;

}


薄弱的地方就是数组定义跟数组参数传递出了问题。现在要好好的解决一下。上面是刚开始的编写的,很混乱的说。

下面我有改动了一下,还是错误很多,还要学习继续改进。

第二次:

#include <iostream>
#define MaxLen 50
typedef int elemtype;
typedef elemtype sqlist;
int create(sqlist A[] );
int insert(sqlist A[],int n,int i,elemtype x);
int dele(sqlist A[],int n,int i);
int find(sqlist A[],int n,int x);
void  output(sqlist A[],int n);
using namespace std;
void main()
{
int i;
int A[MaxLen];
int n;
n=create(A);
output(A,n);
insert(A,n,3,27);
cout << "27在里面吗?" << endl;
find(A,n,27);
cout << "1000在里面吗?" << endl;
find(A,n,1000);
output(A,n);
dele(A,n,3);
output(A,n);

}

int create(sqlist A[])
{
int i,n;
cin >> n;
for(i=0;i<n;i++)
cin >> A[i];
return n;
}

int insert(sqlist A[],int n,int i,elemtype x) //在第i位置前插入x,若i=0,元素为第一元素,i=n 插入其后
{
int j;
if(i<0||i>n) cout << "wrong";
else
for(j=n-1;j>=i;j--)
{
A[j+1]=A[j];
A[i]=x;
n++;
}
return n;
}

int dele(sqlist A[],int n,int i) //删除第i个元素
{
int j;
if(i<0||i>n) cout << "wrong";
for(j=i;j<n-1;j++)
A[j]=A[j+1];
n--;
return n;
}

int find(sqlist A[],int n,int x)//按值查找,查找x值,返回其位置
{
int i;
while(i<=n&&A[i]!=x) i++;
if(i<n) return 1;
else return 0;
}

void  output(sqlist A[],int n)
{
int i;
cout << "输出一个顺序表:" << endl << " ";
if(n==0) cout << "空表";
for(i=0;i<n;i++)
cout << A[i] << " ";
cout << endl;
}


第三阶段,还在修改中,不过收货还是有的,等改对了,把心得写一下。

#include <iostream>
#define MaxLen 50
typedef int elemtype;
typedef elemtype sqlist;
int create(sqlist A[] );
int insert(sqlist A[],int n,int i,elemtype x);
int dele(sqlist A[],int n,int i);
int find(sqlist A[],int n,int x);
void  output(sqlist A[],int n);
using namespace std;
void main()
{
int i;
int A[MaxLen];
int n;
cout << "输入个数n,然后输入数组元素" << endl;
n=create(A);
output(A,n);
insert(A,n,3,27);
cout << "27在里面吗?" << endl;
int b=find(A,n,27);
if(b=1)
cout << "27在里面" << endl;
else cout << "27不在里面" << endl;
cout << "1000在里面吗?" << endl;
int a=find(A,n,1000);
if(a=1)
cout << "1000在里面" << endl;
else
cout << "1000不在里面" << endl;
output(A,n);
cout << "把第3个元素删除" << endl;
dele(A,n,3);
output(A,n);

}

int create(sqlist A[])
{
int i,n;
cin >> n;
for(i=0;i<n;i++)
cin >> A[i];
return n;
}

int insert(sqlist A[],int n,int i,elemtype x) //在第i位置前插入x,若i=0,元素为第一元素,i=n 插入其后
{
int j;
if(i<0||i>=n) cout << "wrong";
else
for(j=n-1;j>=i;j--)
{
A[j+1]=A[j];
A[i]=x;
n++;
}
return n;
}

int dele(sqlist A[],int n,int i) //删除第i个元素
{
int j;
if(i<0||i>n) cout << "wrong";
for(j=i;j<n-1;j++)
A[j]=A[j+1];
n--;
return n;
}

int find(sqlist A[],int n,int x)//按值查找,是否存在,存在返回1,否则返回0
{
int i=0;
while(i<=n&&A[i]!=x) i++;
if(i<n) return 1;
else return 0;
}

void  output(sqlist A[],int n)
{
int i;
cout << "输出一个顺序表:" << endl << " ";
if(n==0) cout << "空表";
for(i=0;i<n;i++)
cout << A[i] << " ";
cout << endl;
}

下面是修改成功后的代码...。修改后的最后代码:插入数组为 5个。7 12 21 35 56.

#include <iostream>
#define MaxLen 50
typedef int elemtype;
typedef elemtype sqlist;
int create(sqlist A[] );
int insert(sqlist A[],int& n,int i,elemtype x);
int dele(sqlist A[],int& n,int i);
int find(sqlist A[],int n,int x);
void  output(sqlist A[],int n);
using namespace std;
void main()
{
int i;
int A[MaxLen];
int n;
cout << "输入个数n,然后输入数组元素" << endl;
n=create(A);
output(A,n);
cout << "插入27" << endl;
insert(A,n,3,27);
output(A,n);
cout << "27在里面吗?" << endl;
int b=find(A,n,27);
if(b==1)
cout << "27在里面" << endl;
else cout << "27不在里面" << endl;
cout << "1000在里面吗?" << endl;
int a=find(A,n,1000);
if(a==1)
cout << "1000在里面" << endl;
else
cout << "1000不在里面" << endl;
output(A,n);
cout << "把第3个元素删除" << endl;
dele(A,n,3);
output(A,n);

}

int create(sqlist A[])
{
int i,n;
cin >> n;
for(i=0;i<n;i++)
cin >> A[i];
return n;
}

int insert(sqlist A[],int& n,int i,elemtype x) //在第i位置前插入x,若i=0,元素为第一元素,i=n 插入其后
{
int j;
if(i<0||i>n) cout << "wrong";
else
for(j=n-1;j>=i;j--)
{
A[j+1]=A[j];

}

A[i]=x;
n++;     // 这个地方放错过好多次了,插入时候,最后赋值给确定位置。
return n;
}

int dele(sqlist A[],int& n,int i) //删除第i个元素
{
int j;
if(i<0||i>n) cout << "wrong";
for(j=i;j<n-1;j++)
A[j]=A[j+1];
n=n--;
return n;
}

int find(sqlist A[],int n,int x)//按值查找,是否存在,存在返回1,否则返回0
{
int i=0;
while(i<=n&&A[i]!=x) i++;
if(i<n) return 1;
else return 0;
}

void  output(sqlist A[],int n)
{
int i;
cout << "输出一个顺序表:" << endl << " ";
if(n==0) cout << "空表";
for(i=0;i<n;i++)
cout << A[i] << " ";
cout << endl;
}


正确显示结果:


这个程序虽然简单,但是编写起来还是很是不容易,由失败到编译成功我记录了下来。在这个过程中,我逐渐明白函数调用传递。在insert 插入和dele删除返回n的时候,需要引用,传递分为按值专递和按址传递。

值传递,形参改变了,但是不影响实参的变化,比如调用的插入函数如果不采用引用,那么结果将是



从中看到,n的值没有发生变化。按址传递时候,是通过实参变量进行操作的,比如void change(int *,int*),可以实现两个整型变量的互换。

若是void change(int ,int)不能改变实参的值。

在这里,传址调用的是实参的地址(数组名),是个常量指针,因为是常量,所以不能改变其值大小。接受实参的形参是指针变量,其值可以变化。比如

void outputs(char *p, int n)
{
int i;
for(i=0;i<n;i++)
printf("%c",p[i]);
}


很少用,但是能说明些问题。

再看一个例子

........
static char A[10]={'s','t','r','i','n','g'};
void outputs (char arr[],int n);
outputs(A,6);
........

void outputs(char[],int n)
{
char *p;
for(p=arr;arr<p+n;arr++)
cout << arr;
arr="sting";
cout << arr;
}


指针变量p指向一个数组首地址,可通过p[i](i=0,1,2.....)访问数组每个单元,也说明了形参数组名有变量的性质。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: