线性表的顺序存储结构实验
1. 数据结构实验,线性表的顺序存储结构的实现
C++代码编写的
#include<iostream>
#include<string>
usingnamespacestd;
typedefintElemType;
typedefstructLNode
{
ElemTypedata;
structLNode*next;
}LinkList;
voidCreatListR(LinkList*&L,ElemTypea[],intn)
{
LinkList*s,*r;
inti;
//L=(LinkList*)malloc(sizeof(LinkList));
L=newLinkList();
r=L;
for(i=0;i<n;i++)
{
//s=(LinkList*)malloc(sizeof(LinkList));
s=newLinkList();
s->data=a[i];
好信r->next=s;
r=s;
}
r->next=NULL;
}
voidDispList(LinkList*L)
{
LinkList*p=L->next;
while(p!=NULL)
{
cout<<p->data<<"";
p=p->next;
}
cout<<endl;
}
intListInsert(LinkList*&L,inti,ElemTypee)
{
intj=0;
LinkList*p=L,*s;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return0;
else
{
s=newLinkList();
s->data=e;
s->next=p->next;
p->next=s;
return1;
}
}
intListDelete(LinkList*&L,inti)
{
intj=0;
LinkList*p=L,*q;
while(j<i-1&&p!=NULL)
{
j++;
槐皮p=p->next;
}
if(p==NULL)
{
return0;
}
else
{
q=p->next;
if(q==NULL)
{
return0;
}
p->next=q->next;
inta=q->data;
free(q);
returna;
}
}
intmain()
{
LinkList*L,*L1;
铅袜差inta[]={1,5,7,9,12,18,19,20,30,43,45,56,41,42,78};
intn=15,i,x,y,j;
CreatListR(L,a,n);
DispList(L);
cout<<"请输入i"<<endl;
cin>>i;
cout<<"请输入x"<<endl;
cin>>x;
ListInsert(L,i,x);
DispList(L);
cout<<"请输入j"<<endl;
cin>>j;
y=ListDelete(L,j);
DispList(L);
cout<<y<<endl;
return0;
}
2. 求数据结构试验 线性表的顺序存储结构
#include<iostream.h>
#include<stdlib.h>
#include <malloc.h>
#define OVERFLOW 0
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 100//线性表存储空间的初始增量
#define LISTINCREMENT 10 // ?
typedef struct{
int * elem;// 存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量
}SqList;
SqList L;
int InitList_Sq(SqList & L){
//构造一个新的线性表。
L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L.elem)exit(OVERFLOW);//存储容量失败
L.length=0; //空表长度为0
L.listsize=LIST_INIT_SIZE;//存储初始容量
return OK;
}//InitList_Sq
int LIstInsert_Sq(SqList & L,int i,int e){
//在顺序线性表L中第i位置之前插入新的元素e
if(i<1||i>L.length+1) return ERROR;
if(L.length>=L.listsize){
int * newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
int * q=&(L.elem[i-1]);
for(int * p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;
*q=e;
++L.length;
return OK;
}
int ListDelete_Sq(SqList&L,int i,int &e)
{
if((i<1)||(i>L.length))return ERROR;
int *p=&(L.elem[i-1]);
e=*p;
int *q=L.elem+L.length-1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length;
return OK;
}
void main()
{
SqList L;
int i,n;
int e;
cout<<"输入顺序表的个数:"<<endl;
cin>>n;
int *p=(int *)malloc(n*sizeof(int));
InitList_Sq(L);
cout<<"输入线性表"<<n<<"个元素的值"<<endl;
for(i=0;i<n;i++)
{
cin>>p[i];
L.elem[i]=p[i];
}
cout<<endl;
L.length=i;
cout<<endl;
cout<<"输入要插入元素的值"<<endl;
cin>>e;
cout<<endl;
cout<<"输入要插入的位置"<<endl;
cin>>i;
LIstInsert_Sq( L, i, e);
for(i=0;i<n+1;i++)
cout<<L.elem[i];
cout<<endl;
cout<<"输入要删除的位置"<<endl;
cin>>i;
ListDelete_Sq(L,i,e)
;for(i=0;i<n;i++)
cout<<L.elem[i];
free(p);
3. 绾挎ц〃镄勯‘搴忓瓨鍌ㄧ粨鏋
瀛桦偍鍗曞厓鍦板潃杩炵画锛屽畠浠モ灭墿鐞嗕綅缃鐩搁偦钬濇潵琛ㄧず绾挎ц〃涓鏁版嵁鍏幂礌闂寸殑阃昏緫鍏崇郴锛屽彲闅忔満瀛桦彇琛ㄤ腑浠讳竴鍏幂礌銆
椤哄簭琛ㄦ槸鍦ㄨ$畻链哄唴瀛树腑浠ユ暟缁勭殑褰㈠纺淇濆瓨镄勭嚎镐ц〃锛岀嚎镐ц〃镄勯‘搴忓瓨鍌ㄦ槸鎸囩敤涓缁勫湴鍧杩炵画镄勫瓨鍌ㄥ崟鍏冧緷娆″瓨鍌ㄧ嚎镐ц〃涓镄勫悇涓鍏幂礌銆佷娇寰楃嚎镐ц〃涓鍦ㄩ昏緫缁撴瀯涓婄浉闾荤殑鏁版嵁鍏幂礌瀛桦偍鍦ㄧ浉闾荤殑鐗╃悊瀛桦偍鍗曞厓涓銆
绾挎ц〃缁撴瀯鐗圭偣
1銆佸潎鍖镐э纴铏界劧涓嶅悓鏁版嵁琛ㄧ殑鏁版嵁鍏幂礌鍙浠ユ槸钖勭嶅悇镙风殑锛屼絾瀵逛簬钖屼竴绾挎ц〃镄勫悇鏁版嵁鍏幂礌蹇呭畾鍏锋湁鐩稿悓镄勬暟鎹绫诲瀷鍜岄暱搴︺
2銆佹湁搴忔э纴钖勬暟鎹鍏幂礌鍦ㄧ嚎镐ц〃涓镄勪綅缃鍙鍙栧喅浜庡畠浠镄勫簭鍙凤纴鏁版嵁鍏幂礌涔嫔墠镄勭浉瀵逛綅缃鏄绾挎х殑锛屽嵆瀛桦湪鍞涓镄勨灭涓涓钬滃拰钬沧渶钖庝竴涓钬濈殑鏁版嵁鍏幂礌锛岄櫎浜嗙涓涓鍜屾渶钖庝竴涓澶栵纴鍏跺畠鍏幂礌鍓嶉溃鍧囧彧链変竴涓鏁版嵁鍏幂礌(鐩存帴鍓嶉┍)鍜屽悗闱㈠潎鍙链変竴涓鏁版嵁鍏幂礌锛堢洿鎺ュ悗缁э级銆
4. 数据结构完整版实验报告
(一)实验目的和要求
实验目的:熟练掌握线性表的基本操作在顺序存储结构上的实现。
实验要求:任选一种高级程序语言编写源程序,并调试通过,测试正确。
(二)实验主要内容
1. 建立n个元素的顺序表SqList,实现顺序表的基本操作;
2. 在SqList的元素i之后插入一个元素,实现顺序表插入的基本操作;
3. 在sqList中删除指定位置i上的元素,实现顺序表删除的操作。
4.
(三)主要仪器设备
PC机,Windows XP操作平台,Visual C++
(四)实验原理
顺序表操作:定义一个顺序表类,该类包括顺序表的存储空间、存储容量和长度,以及构造、插入、删除、遍历等操作的方法
(五)实验步骤与调试分析:
顺序表操作:先构造有四个数据的顺序表,在第4个位置插入9,再读取并删除第3个元素。
(六)实验结果与分析:
顺序表操作:
(七)附录(源程序):
#include<iostream>
using namespace std;
const int LIST_INIT_SIZE=10; //顺序表初始长度
const int LISTINCREMENT=5; //顺序表长度增值
class SqList
{
int *L; //定义存储空间起始地址
int length; //顺序表当前长度
int listsize; //顺序表当前存储容量
bool flag; //设立标志值记录操作成败
public:
SqList(int v1,int v2,int v3,int v4); //构造函数构造并初始化顺序表
void ListInsert(int i,int e); //实现将e插入到顺序表中第i个位置
void ListDelete(int i,int &e); //实现删除顺序表第i个元素
void ListVisit(); //实现顺序表的遍历
};
SqList::SqList(int v1,int v2,int v3,int v4) //构造并初始化顺序表
{
L=new int[LIST_INIT_SIZE];
if(!L) //分配失败
{
flag=false;
cout<<"ERROR"<<endl;
}
else //分配成功,进行初始化
{
*L=v1;
*(L+1)=v2;
*(L+2)=v3;
*(L+3)=v4;
length=4;
listsize=LIST_INIT_SIZE;
flag=true;
}
}
void SqList::ListInsert(int i,int e) //插入元素
{
int *p,*q;
int t;
if(i<1||i>length+1) cout<<"ERROR"<<endl; //插入位置错误
else
{
if(length==listsize) //空间不足,增加分配
{
p=new int[listsize+LISTINCREMENT];
if(!p) cout<<"ERROR"<<endl; //分配失败
else //分配成功,复制顺序表
{
for(t=0;t<length;t++)
*(p+t)=*(L+t);
q=L;L=p;p=q;
delete q;
listsize+=LISTINCREMENT;
}
}
for(t=length;t>=i;t--)
*(L+length)=*(L+length-1);
*(L+i-1)=e;
length++; //插入成功,表长加1
}
}
void SqList::ListDelete(int i,int &e)
{
if(i<1||i>length) cout<<"ERROR"<<endl; //删除位置错误
else
{
e=*(L+i-1);
while(i<length)
{
*(L+i-1)=*(L+i);
i++;
}
length--; //删除成功表长减1
}
}
void SqList::ListVisit() //遍历
{
int i;
for(i=0;i<length;i++)
cout<<" "<<*(L+i);
cout<<endl;
}
int main()
{
int e=0;
SqList list(2,3,4,5);
list.ListVisit();
list.ListInsert(4,9);
list.ListVisit();
list.ListDelete(3,e);
list.ListVisit();
cout<<"e="<<e<<endl;
return 0;
}
5. 顺序表的基本操作实验总结
顺序表的基本操作实验总结:
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,
即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。采用顺序存储结构的线性表简称为“ 顺序表”。顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤i≤n
其中,L是元素占用存储单元的长度。如顺序表的每个结点占用len个内存单元,用location (ki)表示顺序表中第i个结点ki所占内存空间的第1个单元的地址。则有如下的关系:location (ki+1) = location (ki) +len