线性表顺序存储

.h文件

#include <iostream>
using namespace std;

//初始化
void InitList(List &L)
{
	L.size = 0;
}

//删除所有元素
void ClearList(List &L)
{
	L.size = 0;
}

//求表长
int ListSize(const List L)
{
	return L.size;
}

//检查线性表是否为空
int ListEmpty(const List L)
{
	return (L.size == 0);
}

//得到指定序号的元素
ElemType GetElem(const List L,int pos)
{
	if(pos < 1 || pos > L.size)
	{
		cerr<<"pos is out of range!"<<endl;
		exit(1);
	}
	return L.list[pos - 1];
}

//遍历线性表并打印
void TraverseList(const List L)
{
	int i = 1;
	while(i <= L.size)
	{
		cout<<GetElem(L,i)<<" ";
		i++;
	}
	cout<<endl;
}

//是否从线性表中查找具有定值的第一个元素
int Find(const List L, ElemType &item)
{
	for(int i = 0; i < L.size; i++)
	{
		if(L.list[i] == item)  //有时‘==’需要重载
		{
			item = L.list[i];
			return 1;
		}
	}
	return 0;
}

//更新线性表中具有定值的第一个元素
int Update(List &L, const ElemType &item)
{
	for(int i = 0; i < L.size; i++)
	{
		if(L.list[i] == item)  //有时‘==’需要重载
		{
			L.list[i] = item;
			return 1;
		}
	}
	return 0;
}

//向线性表的末尾添加一个元素
void InsertRear(List &L, const ElemType &item)
{
	if(L.size == MaxSize)
	{
		cerr<<"List overflow!"<<endl;
		exit(1);
	}
	L.list[L.size] = item;
	L.size++;
}
//向线性表的表头插入一个元素
void InsertFront(List &L, const ElemType &item)
{
	if(L.size == MaxSize)
	{
		cerr<<"List overflow!"<<endl;
		exit(1);
	}
	for(int i = L.size - 1; i >= 0; i--)
		L.list[i+1] == L.list[i];
	L.list[0] = item;
	L.size++;
}

//向线性表中满足条件的位置插入一个元素
void Insert(List &L, const ElemType &item)
{
	if(L.size == MaxSize)
	{
		cerr<<"List overflow!"<<endl;
		exit(1);
	}
	int i = 0;
	for(int i = 0; i < L.size; i++)
	{
		if(item < L.list[i])
			break;
	}
	for(int j = L.size; j >= i; j--)
		L.list[j+1] == L.list[j];
	L.list[i] = item;
	L.size++;
}

//从线性表中删除表头元素
ElemType DeleteFront(List &L)
{
	if(L.size == 0)
	{
		cerr<<"Deleting from an empty list!"<<endl;
		exit(1);
	}
	ElemType temp = L.list[0];
	for(int i = 1; i < L.size; i++)
		L.list[i-1] = L.list[i];
	L.size--;
	return temp;
}

//从线性表中删除等于给定值的第一个元素
int Delete(List &L, const ElemType &item)
{
	if(L.size == 0)
	{
		cerr<<"L is an empty list!"<<endl;
		return 0;
	}
	int i;
	for(i = 0; i < L.size; i++)
	{
		if(item == L.list[i])
			break;
	}
	if(i == L.size)
	{
		cerr<<"Deleted element is not exist!"<<endl;
		return 0;
	}
	for(int j = i+1; j < L.size; j++)
		L.list[j-1] = L.list[j];
	L.size--;
	return 1;
}

//对线性表进行排序(插入排序)
void Sort(List &L)
{
	ElemType x;
	for(int i = 1; i < L.size; i++)
	{
		x = L.list[i];
		int j;
		for(j = i - 1; j >= 0; j--)
		{
			if(x < L.list[j])
				L.list[j + 1] = L.list[j];
			else
				break;
		}
		L.list[j + 1] = x;
	}
}

.cpp文件

#include <iostream>
#include <stdlib.h>
#include <iomanip>
#include <string>
#include <fstream>

using namespace std;

struct goods
{
	char code[5];
	char name[15];
	int minq;
	int curq;
};

typedef goods ElemType;

const int MaxSize = 10;

struct List
{
	ElemType list[MaxSize];
	int size;
};

//运算符重载操作
int operator == (const ElemType &e1, const ElemType &e2)
{
	return (strcmp(e1.code,e2.code) == 0);
}

int operator < (const ElemType &e1, const ElemType &e2)
{
	return (strcmp(e1.code,e2.code) == -1);
}

ostream& operator << (ostream &ostr, const ElemType &x)
{
	ostr<<x.code<<setw(12)<<x.name<<setw(4)<<x.minq<<setw(4)<<x.curq<<endl;
	return ostr;
}

#include "LinearList.h"

void SetupDoodsList(List &L, char *fname)
{
	ifstream ifstr(fname,ios::in|ios::_Nocreate);
	if(!ifstr)
	{
		cerr<<"File 'goods' not found!"<<endl;
		exit(1);
	}
	goods g;
	while(ifstr>>g.code)
	{
		ifstr>>g.name>>g.minq>>g.curq;
		InsertRear(L,g);
	}
	ifstr.close();
}

void WriteGoodsFile(char *fname, List &L)
{
	ofstream ofstr(fname);
	if(!ofstr)
	{
		cerr<<"File 'goods' no create!"<<endl;
	}
	goods g;
	int n = ListSize(L);
	for(int i = 1; i <= n; i++)
	{
		g = GetElem(L, i);
		ofstr<<g.code<<" "<<g.name<<" "<<g.minq<<" "<<g.curq<<endl;
	}
	ofstr.close();
}

int main()
{
	List L2;
	InitList(L2);
	SetupDoodsList(L2,"goods.dat");
	int i,flag = 1;
	while(flag)
	{
		cout<<"1 打印整个库存表"<<endl;
		cout<<"2 修改库存表中的记录"<<endl;
		cout<<"3 删除库存表中的记录"<<endl;
		cout<<"4 对库存表排序"<<endl;
		cout<<"5 结束处理过程"<<endl;
		cout<<"输入你的选择:";
		cin>>i;
		while(i < 1 || i > 5)
		{
			cout<<"请重新输入选择(1~5):";
			cin>>i;
		}
		cout<<endl;
		switch(i)
		{
		case 1:   //打印
			TraverseList(L2);
			break;
		case 2:  //修改
			goods g;
			int x;
			cout<<"输入待修改的商品代号:";
			cin>>g.code;
			if(Find(L2,g))
			{
				cout<<"输入该商品的修正量:";
				cin>>x;
				g.curq += x;
				Update(L2, g);
			}
			else
			{
				cout<<"输入新商品记录的其他字段的内容:"<<endl;
				cin>>g.name>>g.minq>>g.curq;
				InsertRear(L2,g);
			}
			break;
		case 3:  //删除
			cout<<"输入待删除商品的商品代号:";
			cin>>g.code;
			Delete(L2, g);
			break;
		case 4:
			Sort(L2);
			break;
		case 5:   //结束
			cout<<"本次处理结束,再见!"<<endl;
			flag = 0;
			break;
		}
	}
	WriteGoodsFile("goods.dat",L2);
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值