一、实验目的
- 理解并掌握线性表的逻辑结构和顺序存储、链式存储方式;
- 理解顺序表相关基本算法、线性链表相关基本算法;
- 编程对相关算法进行验证;
- 线性表中的元素要从终端输入,具体的输入和输出格式不限;
- 算法要具有较好的健壮性,如:对插入、删除操作中的错误操作要做适当处理。
二、实验任务
- 构造一个线性表L,分别用顺序存储方式和带头结点的单链表方式存储该线性表,并将两种方式存储的线性表单独输出、单独求出长度;(下述实验内容2至4也要求在两种存储方式下单独实现,不再重复说明)
- 在第1步所构造的线性表L中取序号为i的元素,并用变量e返回;
- 在第1步所构造的线性表L中第i个元素之前插入一个元素e并将更新后的线性表L输出;
- 在第3步更新后所得到的线性表L中删除第j个元素,用变量e返回该元素,并将更新后的线性表L输出。
三、实验过程与结果
1.顺序存储
#include"stdafx.h"
#include<iostream>
using namespace std;
typedef int Status;
#define OK 1
#define ERROR 0
#define FALSE 0
#define TRUE 1
//#define OVERFLOW -2
template<typename T>
class SqList{
private:
int length;
int listSize;
T *base;
public:
SqList(int listSize=100){
this->listSize=listSize;
}
void InitSqList(){
base=new T[listSize];
length=0;
// base=(T *)realloc(this->base,(this->listSize+1)*sizeof(T));
}
void DestroyList(){
length=0;
delete base;
}
void ClearList(){
length=0;
}
bool ListEmpty(){
return length>=0?false:true;
}
int ListLength(){
return length;
}
Status GetElem(int i,T &e){
if(i>length || i<=0)
return ERROR;
e=base[i-1];
return OK;
}
int LocateElem(T e){
for(int i=0;i<length;i++){
if(base[i]==e)
return i+1;
}
return 0;
}
void ListInsert(int i,T e){
if(length==listSize)
base=(T *)realloc(this->base,(this->listSize+1)*sizeof(T));
if(i>=length)
base[length]=e;
else if(i<=0){
for(int j=length;j>0;j--)
base[j]=base[j-1];
base[0]=e;
}
else{
for(int j=length;j>i-1;j--)
base[j]=base[j-1];
base[i-1]=e;
}
length++;
}
void ListInsert(T e){
if(length==listSize)
base=(T *)realloc(this->base,(this->listSize+1)*sizeof(T));
base[length]=e;
length++;
}
Status ListDelete(int i,T &e){
if(i<1 || i>length)
return ERROR;
e=base[i-1];
for(int j=i-1;j<length-1;j++){
base[j]=base[j+1];
}
length--;
return OK;
}
void ListPrint(){
if(!ListEmpty()){
int count=0;
for(int i=0;i<length;i++){
cout<<base[i]<<" ";
count++;
if(count%20==0)
cout<<endl;
}
cout<<endl;
}
else
return;
}
};
int main(){
SqList<int> s;
s.InitSqList();
for(int i=0;i<10;i++){
s.ListInsert(i+1);
}
s.ListPrint();
cout<<endl;
int i=3;
int e;
if(s.GetElem(i,e)){
cout<<"第"<<i<<"位的元素为"<<e<<endl;
}
else
cout<<"没有找到第"<<i<<"位的元素!"<<endl;
cout<<endl;
i=5;
s.ListInsert(i,1314);
cout<<"插入元素后的链表为:"<<endl;
s.ListPrint();
cout<<endl;
int j=3;
if(s.ListDelete(j,e)){
cout<<"删除第"<<j<<"位的元素"<<e<<"后的链表为:"<<endl;
s.ListPrint();
cout<<endl;
}
else{
cout<<"没有成功删除第"<<j<<"位的元素,当前链表为:"<<endl;
s.ListPrint();
cout<<endl;
}
return 0;
}
2.带头结点单链表
#include"stdafx.h"
#include<iostream>
using namespace std;
typedef struct LNode{
int date;
LNode *next;
}LNode,*LinkList;
void InitList(LinkList &L);
void AddElem(LinkList &L,int e);
void Insert(LinkList &L,int e,int i);
bool GetElem(LinkList &L,int i,int &t);
bool DeleteElem(LinkList &L,int j,int &e);
int ListLength(LinkList &L);
bool IsEmpty(LinkList &L);
void ListPrint(LinkList &L);
int main(){
LinkList L;
InitList(L);
for(int i=0;i<10;i++){
AddElem(L,i+1);
}
ListPrint(L);
cout<<endl;
int i=3;
int e;
if(GetElem(L,i,e)){
cout<<"第"<<i<<"位的元素为"<<e<<endl;
}
else
cout<<"没有找到第"<<i<<"位的元素!"<<endl;
cout<<endl;
i=5;
Insert(L,1314,i);
cout<<"插入元素后的链表为:"<<endl;
ListPrint(L);
cout<<endl;
int j=4;
if(DeleteElem(L,j,e)){
cout<<"删除第"<<j<<"位的元素"<<e<<"后的链表为:"<<endl;
ListPrint(L);
cout<<endl;
}
else{
cout<<"没有成功删除第"<<j<<"位的元素,当前链表为:"<<endl;
ListPrint(L);
cout<<endl;
}
}
void InitList(LinkList &L){
L=new LNode();
L->next=NULL;
}
void AddElem(LinkList &L,int e){
LNode *p,*t,*Elem;
Elem=new LNode;
Elem->next=NULL;
Elem->date=e;
if(ListLength(L)==0){
L->next=Elem;
}
else{
for(p=L->next;p!=NULL;p=p->next)
t=p;
t->next=Elem;
}
}
void Insert(LinkList &L,int e,int i){
LNode *p,*m,*t;
m=new LNode;
m->date=e;
m->next=NULL;
if(i<=1){
m->next=L->next;
L->next=m;
}
else if(i>1&&i<=ListLength(L)){
int k=0;
t=NULL;
for(p=L->next;p!=NULL;p=p->next){
k++;
if(k==i)
break;
t=p;
}
t->next=m;
m->next=p;
}
else{
t=NULL;
for(p=L->next;p!=NULL;p=p->next)
t=p;
t->next=m;
}
}
bool GetElem(LinkList &L,int i,int &t){ //返回线性表中第i位的元素的值
LNode *p;
if(i>ListLength(L) && i<1){
return false;
}
int k=0;
for(p=L->next;p!=NULL;p=p->next){
k++;
if(k==i){
t=p->date;
return true;
}
}
return false;
}
bool DeleteElem(LinkList &L,int j,int &e){
if(j>ListLength(L) && j<1){
return false;
}
LNode *p,*t;
int k=0;
t=L;
for(p=L->next;p!=NULL;p=p->next){
k++;
if(k==j){
e=p->date;
t->next=p->next;
delete p;
return true;
}
t=p;
}
return false;
}
int ListLength(LinkList &L){ //返回长度
LNode *p;
int s=0;
for(p=L->next;p!=NULL;p=p->next){
s++;
}
return s;
}
bool IsEmpty(LinkList &L){
return (ListLength(L)==0)?true:false;
}
void ListPrint(LinkList &L){
LNode *p;
cout<<"L";
if(IsEmpty(L)){
cout<<"->NULL"<<endl;
return;
}
for(p=L->next;p!=NULL;p=p->next){
cout<<"->"<<p->date;
}
cout<<endl;
}