顺序表就是线性表的顺序存储结构!顺序表中各数据元素的地址连续(虚拟地址)。
/*
*Copyright (c) 2017, 烟台大学计算机学院
*All rights reserved.
*文件名称:渣.cpp
*作 者:朱坤昂
*完成日期:2017年9月13日
*版 本 号:v1.0
*
*问题描述:顺序表基本算法的实现
*输入描述:一组数
*程序输出:见程序运行截屏
*/
#include<iostream>///共实现了顺序表的十个基本算法
#include<stdlib.h>
using namespace std;
# define listinitsize 100
typedef struct
{
int *elem;
int length;
int listsize;
}sqlist;
int initlist(sqlist &p)///初始化
{
p.elem=(int *)malloc(listinitsize*sizeof(int));
if(!p.elem)
return 0;
p.length=0;
p.listsize=listinitsize;
return 1;
}
void creat(sqlist &p,int k)///创建顺序表
{
int i;
for(i=0;i<k;i++)
{
cin>>p.elem[i];
p.length++;
}
}
void display(sqlist &p)///输出
{
int i=0;
if(p.length==0)
{
cout<<"该顺序表为空"<<endl;
return;///自己对return的认识太片面了!
}
while(i!=p.length-1)
{
cout<<p.elem[i]<<' ';
i++;
}
cout<<p.elem[i]<<endl;
}
int listempty(sqlist &p)///是空返回1,不是空返回0
{
if(!p.length)
return 1;
else
return 0;
}
void zhiweiempty(sqlist &p)///将顺序表置为空表
{
p.length=0;
}
int listlength(sqlist &p)///求顺序表的长度
{
return p.length;
}
int getelem(sqlist &p,int q)///求顺序表中的第q个元素,若不存在,则返回零
{
int i=1;
while(i!=q)
{
i++;
}
if(i<p.length&&i==q)
return p.elem[i-1];
else
return 0;
}
int donglist(sqlist &p,int f)///求顺序表中第一个与输入元素相同的元素的逻辑序号
{
int i=0;
while(p.elem[i]!=f&&i<p.length)
{
i++;
}
if(i<=p.length-1)
return i+1;
else
return 0;
}
int insertlist(sqlist &p,int n,int m)///在顺序表的第n个位置插入新元素
{
int i;
if(n>p.length+1||n<1)///若插入位置错误则结束函数调用
return 0;
for(i=p.length;i>=n;i--)
{
p.elem[i]=p.elem[i-1];
}
p.elem[n-1]=m;
p.length++;
return 0;
}
int deletelist(sqlist &p,int n)///删除顺序表的第n个元素
{
int i;
if(n<1||n>p.length)
return 0;
for(i=n-1;i<p.length-1;i++)
{
p.elem[i]=p.elem[i+1];
}
p.length--;
return 0;
}
void destroylist(sqlist *&x)
{
free(x);
cout<<"顺序表已被销毁"<<endl;
}
int main()
{
sqlist p,*x;
x=&p;
int k,s,h,z,g,c,e,w,u,r,b;
cin>>k;
initlist(p); ///初始化
creat(p,k);
display(p);
cin>>r;
deletelist(p,r);
display(p);
cin>>u>>b;
insertlist(p,u,b);
display(p);
cin>>c;
g=getelem(p,c);
cout<<g<<endl;
cin>>e;
w=donglist(p,e);
cout<<w<<endl;
z=listlength(p);
cout<<z<<endl;
s=listempty(p);
cout<<s<<endl;
zhiweiempty(p);
h=listempty(p);
cout<<h<<endl;
display(p);
destroylist(x);///虽然我们刚刚申请到的内存空间被释放掉了,但其中的值并没有消失!!!
display(p);
cout<<x->elem[5]<<endl;///这个还是很有意思的,通过程序的运行结果我们知道数据仍然存在!
return 0;
}
下面附上程序总体运行结果的截图
这个程序中共有11个顺序表的基本操作,因受销毁线性表操作的启发;我写了一个将顺序表置为空的一个操作!还有一个有趣的问题,就是销毁顺序表之后,内存空间中的元素是否还在?答案是肯定的,元素还在,Why?这个似乎与操作系统有关;但我们可以将其简单地理解为当我们执行完销毁顺序表这一操作之后,系统就将顺序表所占的这块内存空间标记为空!这块内存空间就可以再被使用了;所以随着新值存入这块内存空间,内存空间中原有的值也就被覆盖掉了!
还有就是对return语句的理解;return后可以不再跟具体的值,程序运行到return语句,函数调用就结束了!
知识点总结:
顺序表的各种基本操作是非常重要的;引用型指针的运用也是第一次,非常有意义。
心得体会:
虽然实现了顺序表的这几个基本操作,但花费的时间比我料想中的要长一些!有些地方竟然有些胆怯,不敢立马敲;总结起来到底还是写得少呀!