线性表学习笔记 -顺序表实现(1)
2012-11-12 22:46
253 查看
学习内容包括线性表的定义操作,实现(顺序存储和链式存储),以及一些应用。
线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表跟链表只是实现它的一种形式,属于不同层面的关系。
基本操作(顺序存储) 1、创建表。2、顺序表中插入元素。3、顺序表删除元素。4、顺序表中超找元素。5、输出元素
这是我自己最初编写的错误程序。里面概念混乱,运行不成功。
薄弱的地方就是数组定义跟数组参数传递出了问题。现在要好好的解决一下。上面是刚开始的编写的,很混乱的说。
下面我有改动了一下,还是错误很多,还要学习继续改进。
第二次:
第三阶段,还在修改中,不过收货还是有的,等改对了,把心得写一下。
下面是修改成功后的代码...。修改后的最后代码:插入数组为 5个。7 12 21 35 56.
正确显示结果:
这个程序虽然简单,但是编写起来还是很是不容易,由失败到编译成功我记录了下来。在这个过程中,我逐渐明白函数调用传递。在insert 插入和dele删除返回n的时候,需要引用,传递分为按值专递和按址传递。
按值传递,形参改变了,但是不影响实参的变化,比如调用的插入函数如果不采用引用,那么结果将是
从中看到,n的值没有发生变化。按址传递时候,是通过实参变量进行操作的,比如void change(int *,int*),可以实现两个整型变量的互换。
若是void change(int ,int)不能改变实参的值。
在这里,传址调用的是实参的地址(数组名),是个常量指针,因为是常量,所以不能改变其值大小。接受实参的形参是指针变量,其值可以变化。比如
很少用,但是能说明些问题。
再看一个例子
指针变量p指向一个数组首地址,可通过p[i](i=0,1,2.....)访问数组每个单元,也说明了形参数组名有变量的性质。
线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表跟链表只是实现它的一种形式,属于不同层面的关系。
基本操作(顺序存储) 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.....)访问数组每个单元,也说明了形参数组名有变量的性质。
相关文章推荐
- java学习笔记4>顺序线性表的实现及其内存分配
- 严蔚敏版数据结构学习笔记(1):线性表的顺序表示和实现
- 数据结构学习笔记-线性表顺序存储(C语言实现)
- 学习数据结构笔记--顺序表的数组实现
- OpenCv学习笔记--支持向量机SVM线性可分情况下的OpenCv实现的超详细注释(2)
- 数据结构学习之线性表的顺序实现(python 实现)
- 数据结构 学习笔记之:顺序栈的C语言实现
- 斯坦福CS231n 课程学习笔记--线性分类器(Assignment1代码实现)
- 数据结构笔记(一)线性表的顺序表示和基本操作及其顺序表实现的集合运算(A-B)U(B-A)实例
- 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现
- 数据结构学习-线性表-顺序表的代码实现
- 数据结构学习笔记3——顺序表的实现
- 严蔚敏版数据结构学习笔记(2):线性表的链式表示和实现
- 数据结构 学习笔记(二):线性结构:线性表(顺序表,链表,广义表,多重链表)
- 机器学习入门学习笔记:(2.2)线性回归python程序实现
- 学习笔记---线性表的基本操作---顺序存储(C语言)
- 数据结构学习笔记 --- 队列(循环队列-队列的顺序表示和实现)
- 数据结构学习笔记1-线性表(顺序表,单链表)
- 线性表学习归纳总结二:线性表顺序存储实现
- 学习笔记------数据结构(C语言版) 线性表顺序存储