顺序表的基本操作

顺序表的基本操作

(1)根据指定学生个数,逐个输入学生信息; //CreatList(&L)
(2) 逐个显示学生表中所有学生的相关信息; //ViewList(&L)
(3) 根据姓名进行查找,返回此学生的学号;//SearchList(L,name)
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);//GetElem(&L,i,&e)
(5) 给定一个学生信息,插入到表中指定的位置; //ListInsert(&L,i,e)
(6) 删除指定位置的学生记录;//ListDelete(&L,i,&e)
(7) 统计表中及格学生个数。 //CountPassList(L)
(8)将顺序表中成绩为70分以上( >= 70)放在表的前面,70分以下的放在表后面。 //invert(&L)

1.结构定义

#include<iostream>
using namespace std;
#include<string>
#define MAXSIZE 100
#define ERROR 0
#define OK 1
#define FALL -2 
typedef struct student {
	int Id;			//学生ID
	string name;	//学生姓名
	int score;		//学生成绩
	string sex;	//学生性别
}ElemType;

typedef struct LNode {
	ElemType *stu_;	 //顺序表的表头
	int length;		//顺序表的长度
}SqList;

2.顺序表的初始化,创建学生信息函数

int InitList(SqList &L)							//初始化顺序表
{
	L.stu_ = new ElemType[MAXSIZE];
	if (!L.stu_)
		return ERROR;
	L.length = 0;
	return OK;
}

ElemType* CreatElem()	->返回一个学生类型(student或者ElemType)			//创建一个学生信息
{
	ElemType *elem = new student;	//创建一个elem,并分配一个student类型的空间
	cout << "请输入学生Id" << endl;
	cin >> elem->Id;
	cout << "请输入学生姓名" << endl;
	cin >>elem->name;
	cout << "请输入学生姓别" << endl;
	cin >> elem->sex;
	cout << "请输入学生成绩" << endl;
	cin >> elem->score;
	return elem;
}

3.交换节点,打印函数

void Swap(ElemType& a, ElemType& b)				//交换两个结点的数据
{
	ElemType temp = a;		//创建一个中间变量
	a = b;
	b = temp;
}

void Print(SqList L, int i)					//打印在指定位置的学生信息
{
	cout << "学生Id为:" << L.stu_[i].Id << endl;
	cout << "学生姓名为:" << L.stu_[i].name << endl;
	cout << "学生性别为:" << L.stu_[i].sex << endl;
	cout << "学生成绩为:" << L.stu_[i].score << endl;
	
}

4.根据指定学生个数,逐个输入学生信息


//(1)根据指定学生个数,逐个输入学生信息; //CreatList(&L)

int CreatList(SqList &L)
{
	int n;
	cout << "请输入要录入学生的个数:" << endl;
	cin >> n ;
	if (L.length + n > MAXSIZE)
	{
		cout << "录入学生个数多于最大值出现错误!" << endl;
		return ERROR;
	}
	for (int i = 0; i < n; i++)
	{	
		ElemType *e = CreatElem();
		L.stu_[L.length+i].Id = e->Id;
		L.stu_[L.length+i].name = e->name;
		L.stu_[L.length+i].score = e->score;
		L.stu_[L.length + i].sex = e->sex;

	}
	L.length += n;
	return OK;
}

5.逐个显示学生表中所有学生的相关信息

//(2) 逐个显示学生表中所有学生的相关信息; //ViewList(&L)
void ViewList(LNode L)
{
	if (L.length == 0)
		cout << "无学生信息" << endl;
	else
		for (int i = 0; i < L.length; i++)
		{
			cout << "学生Id为:" << L.stu_[i].Id << endl;
			cout << "学生姓名为:" << L.stu_[i].name << endl;
			cout << "学生性别为:" << L.stu_[i].sex << endl;
			cout << "学生成绩为:" << L.stu_[i].score << endl;

		}
}

6.根据姓名进行查找,返回此学生的学号

}

//(3) 根据姓名进行查找,返回此学生的学号;//SearchList(L,name)
int SearchList(SqList L, char* name)
{
	if (L.length == 0)
	{
		cout << "无学生信息" << endl;
		return ERROR;
	}
	for (int i = 0; i < L.length; i++)
	
		if (L.stu_[i].name == name)
		{
			return L.stu_[i].Id;
		}
		cout << "未找到有关的信息" << endl;
		return ERROR;
}

7.根据指定的位置可返回相应的学生信息(学号,姓名,成绩)

//(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);//GetElem(&L,i,&e) 
int GetElem(SqList L, int i, ElemType& e)
{
	if (i>L.length)		//如果i大于顺序表的长度这返回ERROR	
		return ERROR;
	if (L.length==0)		//如果顺序表为空,则返回FALL
		return FALL;
	e.Id = L.stu_[i-1].Id;
	e.name = L.stu_[-1].name;
	e.score = L.stu_[i-1].score;
	e.sex = L.stu_[i-1].sex;
	return OK;
}

8.给定一个学生信息,插入到表中指定的位置

//(5) 给定一个学生信息,插入到表中指定的位置; //ListInsert(&L,i,e)
int ListInsert(SqList& L, int i, ElemType e)
{
	if (L.length + 1 > MAXSIZE )
		return ERROR;
	if(i>L.length)			//如果插入的位置大于顺序表的长度,则直接在表尾插入
		L.stu_[length] = e;
		L.length ++;
		return;
	if(i>MAXSIZE)		//插入位置大于最大限度,返回错误
		return ERROR;
	int j;
	for ( j= L.length; j > i-1; j--)
		L.stu_[j] = L.stu_[j - 1];
	L.stu_[j] = e;
	L.length += 1;
	return OK;
}

9.删除指定位置的学生记录


//(6) 删除指定位置的学生记录;//ListDelete(&L,i,&e)
int ListDelete(SqList& L, int i, ElemType& e)
{
	if (L.length == 0)
		return ERROR;
	if (i > L.length)
		return FALL;
	e = L.stu_[i - 1];
	for (int j =i-1; j < L.length-1; j++)
	{
		L.stu_[j] = L.stu_[j + 1];
	}
	L.length -= 1;
	return OK;
}

10.统计表中及格学生个数

//(7) 统计表中及格学生个数。  //CountPassList(L)
int CountPassList(SqList L)
{
	int count=0;
	if (L.length == 0)
		return ERROR;
	for (int i=0; i < L.length; i++)
		if (L.stu_[i].score >= 60)
			count += 1;
	return count;
}

11.将顺序表中成绩为70分以上( >= 70)放在表的前面,70分以下的放在表后面

//(8)将顺序表中成绩为70分以上( >= 70)放在表的前面,70分以下的放在表后面。 //invert(&L)
int Invert(SqList& L)
{
	if (L.length == 0)
		return ERROR;
	for (int i = 0; i < L.length; i++)//采用冒泡排序的方法
	{
		int MAX = i;
		for (int j = i + 1; j < L.length; j++)
			if (L.stu_[j].score >L.stu_[i].score)
			{
				Swap(L.stu_[j], L.stu_[i]);
			};
	}
	return OK;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
顺序表是一种线性表,它的基本操作包括初始化、插入、删除、查找、遍历等。下面是顺序表基本操作的实现方法: 1. 初始化:顺序表的初始化包括动态分配内存空间和初始化表头信息。具体实现方法如下: ``` Status InitList(SqList &L) { L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType)); if (!L.elem) exit(OVERFLOW); L.length = 0; L.listsize = LIST_INIT_SIZE; return OK; } ``` 2. 插入:在顺序表的第i个位置插入元素x,需要将第i个位置及其后面的元素依次后移一位,然后将x插入到第i个位置。具体实现方法如下: ``` Status ListInsert(SqList &L, int i, ElemType x) { if (i < 1 || i > L.length + 1) return ERROR; if (L.length >= L.listsize) { ElemType* newbase = (ElemType*)realloc(L.elem, (L.listsize + LISINCREMENT) * sizeof(ElemType)); if (!newbase) exit(OVERFLOW); L.elem = newbase; L.listsize += LISINCREMENT; } ElemType* q = &(L.elem[i - 1]); for (ElemType* p = &(L.elem[L.length - 1]); p >= q; --p) *(p + 1) = *p; *q = x; ++L.length; return OK; } ``` 3. 删除:删除顺序表的第i个元素,需要将第i+1个位置及其后面的元素依次前移一位,然后将表长减1。具体实现方法如下: ``` Status ListDelete(SqList &L, int i) { if (i < 1 || i > L.length) return ERROR; ElemType* p = &(L.elem[i - 1]); ElemType* q = L.elem + L.length - 1; for (++p; p <= q; ++p) *(p - 1) = *p; --L.length; return OK; } ``` 4. 查找:查找顺序表中值为x的元素,需要依次遍历顺序表中的每个元素,直到找到值为x的元素或者遍历完整个顺序表。具体实现方法如下: ``` int LocateElem(SqList L, ElemType x) { int i; ElemType* p = L.elem; for (i = 1; i <= L.length; ++i, ++p) if (*p == x) return i; return 0; } ``` 5. 遍历:遍历顺序表中的每个元素,可以使用for循环或者while循环实现。具体实现方法如下: ``` void ListTraverse(SqList L) { int i; ElemType* p = L.elem; for (i = 1; i <= L.length; ++i, ++p) printf("%d ", *p); printf("\n"); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值