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

学习内容包括线性表的定义操作,实现(顺序存储和链式存储),以及一些应用。

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

基本操作(顺序存储) 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.....)访问数组每个单元,也说明了形参数组名有变量的性质。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值