用数组来实现线性表,在处理元素移动和边界位置的时候要注意一点。直接贴代码了。
//线性表的顺序表示
//lovesunmoonlight
//2017.3.29
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<fstream>
using namespace std;
#define LIST_INIT_SIZE 100
#define MAX 10
#define LISTINCREMENT 10
ofstream out;
typedef struct ElemType
{
int key; //键值
double data; //数据域
};
//重载相等运算符用于比较
bool operator==(const ElemType& a,const ElemType& b)
{
if(a.key==b.key&&a.data==b.data)
return true;
return false;
}
typedef struct{
ElemType* elem; //存储空间基地址
int length; //线性表长度
int listsize; //当前分配的存储容量
}SqList;
//初始化表
bool InitList_Sq(SqList& s)
{
s.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //动态分配存储空间
if(!s.elem)
exit(1);
s.length=0; //表长度
s.listsize=LIST_INIT_SIZE; //初始存储容量
return true;
}
//在第i个位置进行插入
bool ListInsert_Sq(SqList& s,int i,ElemType e)
{
if(i<1||i>s.length)
return false;
//当前存储空间已满
if(s.length>=s.listsize)
{
ElemType* newbase=(ElemType*)malloc((s.listsize+LISTINCREMENT)*sizeof(ElemType)); //新的基址
s.elem=newbase;
s.listsize+=LISTINCREMENT;
out<<"DDDDDDDDDDDDDDD"<<endl; //调试用
}
ElemType* q=&(s.elem[i-1]); //插入位置,由于c++的数组下标从0开始,所以在数组中的插入位置为i-1
//当p指向s.elem[s.length]时,尽管此时是一个非法的数组位置,但是由于顺序存储的特点,我们可以对它进行赋值
//在插入完成之后,对表长进行更新,这时的s.elem[s.length]就是一个合法的数组位置了
for(ElemType* p=&s.elem[s.length-1];p>=q;--p) //依次后移
*(p+1)=*p;
*q=e; //插入元素
++s.length; //表长增加1
return true;
}
//删除顺序表i位置的元素,并用e将其返回
bool ListDelete_Sq(SqList& s,int i,ElemType& e)
{
if(i<1||i>s.length)
return false;
ElemType* p=&(s.elem[i-1]); //获取要删除元素的位置,同理是数组中的i-1位置
e=*p; //要返回的元素
for(ElemType* q=p;q<&(s.elem[s.length-1]);q++) //依次向前移动
*q=*(q+1);
--s.length;
return true;
}
//在顺序表中查找元素e,返回其位置(实际位置,不是数组中的存储位置)
int ListLocate_Sq(const SqList& s,ElemType e)
{
for(int i=0;i<s.length;i++)
{
if(s.elem[i]==e)
return (i+1);
}
return 0;
}
void output(const SqList& s)
{
out<<"Key Data"<<endl;
for(int i=0;i<s.length;i++)
out<<s.elem[i].key<<" "<<s.elem[i].data<<endl;
//out<<endl;
}
int main()
{
out.open("result.txt"); //写文件
SqList s;
//初始化表
InitList_Sq(s);
s.elem[0].key=rand()%50;
s.elem[0].data=rand()%100;
++s.length;
for(int i=1;i<MAX;i++)
{
s.elem[i].data=rand()%100;
s.elem[i].key=rand()%50;
++s.length;
}
out<<"Initialized: "<<endl;
output(s);
out<<"The length now: "<<s.length<<endl;
ElemType e;
e.key=11111;
e.data=3.1415926;
//插入操作
bool flag1=ListInsert_Sq(s,1,e);
if(flag1)
{
out<<"After ListInsert_Sq: "<<endl;
output(s);
out<<"The length now: "<<s.length<<endl;
}
//删除操作
bool flag2=ListDelete_Sq(s,1,e);
{
out<<"After ListDelete_Sq: "<<endl;
output(s);
out<<"The element has been deleted: ";
out<<e.key<<" "<<e.data<<endl;
out<<"The length now: "<<s.length<<endl;
}
int pos=ListLocate_Sq(s,s.elem[5]);
if(pos!=0)
{
out<<s.elem[5].key<<" "<<s.elem[5].data<<endl;
out<<"The position is: "<<pos<<endl;
}
return 0;
}