数据结构[严蔚敏版] 第二章 线性表(顺序表)

本文介绍了数据结构中线性表的概念,特别是顺序表的定义,包括其基本概念如基地址,并强调了使用数组作为顺序存储结构的原因,以及在长度可变的情况下如何在C语言中动态分配一维数组。
摘要由CSDN通过智能技术生成

1.基本概念

顺序表:用一组地址连续的存储单元一次存储线性表的元素。
基地址:顺序表中第一个元素的存储位置。

2.要点

(1)因为高级程序设计语言中的数组类型也有随机存取的特性,因此,通常都用数组来描述数据结构中的顺序存储结构。
(2)线性表长度可变,且所需最大存储空间随问题不同而不同,则在C语言中可动态分配一维数组。

3.案例

//线性表的动态分配顺序存储结构:
#include<iostream.h>
#include<stdlib.h>

//定义状态(Status)变量
#define OK 1
#define OVERFLOW -2
#define ERROR 0
//

#define INIT_LIST_SIZE 100//线性表存储空间的初始分配量
#define LISTINCREMENT 10//线性表存储空间的分配增量
typedef int Status;

typedef struct{
	int sno;//学号
	char sname[10];//姓名
}ElemType;//定义顺序表的元素类型

typedef struct{
	ElemType *elem;//储存空间基地址 注:ElemType为链表元素的类型
	int length;//顺序表当前长度
	int listsize;//顺序表被分配的长度
}List;

Status InitList(List &L)
{//顺序表被声明后,进行初始化,构造一个空的顺序表
	L.elem=(ElemType*)malloc(INIT_LIST_SIZE*sizeof(ElemType));
	//上行分析:malloc():
	            //分配内存空间。是stdlib.h中的函数,与free(),realloc()配合使用。
	            //返回值某是void *,故需强制转换为需要的类型指针。若分配成功则返回内存的起始地址;失败则返回NULL。
	if(!L.elem) exit(OVERFLOW);
	L.length=0;
	L.listsize=INIT_LIST_SIZE;
	return OK;
}

Status InsertElem(List &L,int i,ElemType e)
{//在指定位置之前插入元素
 //思路:①先将插入位置及其之后的元素向后移动一位(从后开始)②再将目标元素插入
	if(i<1||i>L.length+1)
		return ERROR;
	if(L.length+1>L.listsize)
	{
		ElemType* newbase;
		newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
		L.elem=newbase;
		L.listsize+=LISTINCREMENT;
	}
	ElemType *p=&(L.elem[L.length-1]);//顺序表尾
	ElemType *q=&(L.elem[i-1]);//插入位置的指针
	for(p;p>=q;p--)//先从后往前将每个元素向后移动一位
		*(p+1)=*p;
	*q=e;//再将目标元素插到对应位置
	L.length++;//顺序表长度+1
	return OK;
}

Status DeleteElem(List &L,int i,ElemType &e)//e用来返回被删除的元素
{//根据位置(1、2、3......L.length)删除元素
 //思路①保存被删除的元素到e ②将删除位置的后一位及之后的元素向前移一位(从前开始移动)
	if(i<1||i>L.length) return ERROR;
	e=L.elem[i-1];
	ElemType *p=&(L.elem[L.length-1]);//顺序表尾
	ElemType *q=&(L.elem[i]);//删除元素的后一位的位置
	for(q;q<=p;q++)
		*(q-1)=*q;//前移一位
	L.length--;//表当前(实际)长度-1
	return OK;
}


void TravelList(List L)
{
	cout<<"学号"<<"\t"<<"姓名"<<endl;
	for(int i=0;i<L.length;i++)
	{
		cout<<L.elem[i].sno<<"\t"<<L.elem[i].sname<<endl;
	}
}

void TravelOne(ElemType e)
{
	cout<<"学号"<<"\t"<<"姓名"<<endl;
	cout<<e.sno<<"\t"<<e.sname<<endl;
}


void SelectElem(List L,int sno,ElemType &e)
{//根据学号查找学生信息
	int i;
	int count=0;//用来计数,由此判断是否查找成功。
	for(i=0;i<L.length;i++)//以数组的视角看
	{
		if(L.elem[i].sno==sno)
		{
			e=L.elem[i];
			count++;
			break;//原则上学号不能重复,所以查询结果为第一个符合条件者信息
		}
	}
	if(count<1)
		cout<<"未找到该同学的信息!"<<endl;
}



void main()
{
	List L;
	InitList(L);

	int fun;

	cout<<"0.退出"<<endl;
    cout<<"1.新增学生信息"<<endl;
	cout<<"2.删除学生信息"<<endl;
	cout<<"3.根据学号查找学生"<<endl;
	cout<<"8.查看所有学生信息"<<endl;

	for(int i=0;;i++)
	{
	cout<<"请选择功能:";
	cin>>fun;
	switch(fun)
	{
	case 0:
		exit(0);
		break;
	case 1:
		ElemType stu;
		cout<<"请输入学号:";
     	cin>>stu.sno;
    	cout<<"请输入姓名:";
	    cin>>stu.sname;
		cout<<endl;
		InsertElem(L,L.length+1,stu);
		break;
	case 2:
		int position_delete;
		cout<<"请输入删除元素的位置:";
		cin>>position_delete;

		ElemType delete_e;//被删除的元素
	    DeleteElem(L,position_delete,delete_e);
		cout<<"被删除的学生信息如下:"<<endl;
		TravelOne(delete_e);
		break;
	case 3:
		int sno;
		ElemType select_result;
		cout<<"请输入你要查找学生的学号:";
		cin>>sno;
		SelectElem(L,sno,select_result);
		TravelOne(select_result);
		break;
	case 8:
		TravelList(L);
		break;

	}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值