线性表的顺序实现

用数组来实现线性表,在处理元素移动和边界位置的时候要注意一点。直接贴代码了。

//线性表的顺序表示
//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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值