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;
}
}
}