数据结构第一次上机——编程实现书P12 ADT List 基本操作14个(南航
·
题目:编程实现书P12 ADT List 基本操作14个:
(1)用顺序存储结构实现;
(2)用链式存储结构实现;
算法思想:
用顺序存储结构实现ADT List基本操作;
运用动态储存,初始化,销毁和清空;进行访问型操作;加工型操作,在增加和删除数据元素时需要移动顺序表内的相应元素,在移动元素时需注意移动的顺序及是否有足够的空间。
用链式存储结构实现ADT List基本操作;
初始化,销毁和清空;访问型操作,序号需要与逻辑描述保持一致;加工型操作,增加和删除数据元素时将新的结点接入单链表或取下。
(1)用顺序存储结构实现;
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
using namespace std;
#define LISTINITSIZE 256
#define LISTINCREMENT 128
typedef int Status;
typedef int ElemType;
typedef struct SeqList
{
ElemType *pData;
int length;
int size;
}SeqList;
Status CreatList(SeqList &L)
{
int n,x;
cout<<"-请输入顺序表的长度-"<<endl;
cin>>n;
cout<<"-请逐个输入顺序表的数据元素-"<<endl;
for(int i=1;i<=n;i++)
{
cin>>x;
L.pData[i-1]=x;
L.length ++;
}
return 0;
}
Status InitList(SeqList &L)
{
L.pData = (ElemType*)malloc(LISTINITSIZE*sizeof(ElemType));
if(L.pData == NULL ) exit(EOVERFLOW);
L.size = LISTINITSIZE;
L.length = 0;
return 0;
}
Status DestroyList(SeqList &L)
{
if(L.pData != NULL)
{
free(L.pData );
L.pData = NULL;
L.length = 0;
L.size = 0;
}
return 0;
}
Status ClearList(SeqList &L)
{
L.length = 0;
return 0;
}
bool ListEmpty(SeqList L)
{
if(!L.pData )
return true;
else
return false;
}
Status ListLength(SeqList L)
{
if(L.length )
return L.length ;
else
return 0;
}
Status GetElem(SeqList L,int i, ElemType &e)
{
if(i<1||i>L.length )
{
cout<<"ERROR"<<endl;
return 0;
}
e = L.pData [i-1];
return e;
}
Status LocateElem(SeqList L,ElemType &e)
{
for(int i=0;i<L.length ;i++)
{
if(L.pData [i]==e)
return i+1;
}
return 0;
}
Status PriorElem(SeqList L,ElemType cur_e, ElemType &pre_e)
{
for(int i=0;i<L.length ;i++)
{
if(i!=0&&cur_e==L.pData [i])
{
pre_e=L.pData [i-1];
return pre_e;
}
}
return 0;
}
Status NextElem(SeqList L,ElemType cur_e,ElemType &next_e)
{
for(int i=0;i<L.length ;i++)
{
if(i!=0&&cur_e==L.pData [i])
{
next_e=L.pData [i+1];
return next_e;
}
}
return 0;
}
Status ListTraverse(SeqList L)
{
ElemType e;
for(int i=1;i<L.length+1 ;i++)
{
if(i<1||i>L.length )
return 0;
else
{
e=L.pData [i-1];
printf("%d",e);
}
}
return 0;
}
Status SetElem(SeqList &L,int i, ElemType &e)
{
if(i<1||i>L.length)
{
cout<<"ERROR"<<endl;
return 0;
}
ElemType f;
f=L.pData [i-1];
L.pData [i-1]=e;
return f;
}
Status InsertElem(SeqList &L,int i,ElemType &e)
{
if(i<1||i>L.length +1)
{
cout<<"ERROR"<<endl;
return 0;
}
if(L.length >=L.size )
{
ElemType *newbase;
newbase = (ElemType*)realloc(L.pData ,(L.size +LISTINCREMENT)*sizeof(ElemType));
if(newbase == NULL)
exit(EOVERFLOW);
L.pData = newbase;
L.size += LISTINCREMENT;
}
for(int j=L.length -1;j>=i-1;j--)
L.pData [j+1] = L.pData [j];
L.pData [i-1] = e;
L.length += 1;
return 0;
}
Status DeleteElem(SeqList &L,int i,ElemType &e)
{
if(i<1||i>L.length +1)
{
cout<<"ERROR"<<endl;
return 0;
}
e=L.pData [i-1];
for(int j=i;j<=L.length -1;j++)
{
L.pData [j-1] = L.pData [j];
}
L.length -= 1;
return e;
}
int main()
{
SeqList L;
int i, n, x;
int &e=x ;
cout<<"-进行初始化操作-"<<endl;
InitList(L);
CreatList(L);
if( ListEmpty(L) == true )
cout<<"顺序表为空表"<<endl;
else
cout<<"顺序表不是空表"<<endl;
cout<<"输出顺序表如下:"<<endl;
ListTraverse(L);
cout<<endl;
cout<<"顺序表长度为:";
cout<<ListLength(L);
cout<<endl;
i = 2;
cout<<"第"<<i<<"个数据元素为:";
cout<<GetElem(L, i, e);
cout<<endl;
x=3;
e=x;
cout<<"元素"<<e<<"所在的位置:";
cout<<LocateElem(L, e);
cout<<endl;
cout<<"元素"<<e<<"的前驱元素为:";
cout<<PriorElem(L, e, e);
cout<<endl;
cout<<"元素"<<e<<"的后继元素为:";
cout<<NextElem(L, e, e);
cout<<endl;
n = 4;
e = 7;
cout<<"第"<<n<<"个元素被"<<e<<"替换前的旧值为:";
cout<<SetElem(L, n, e);
cout<<endl;
cout<<"输出顺序表如下:"<<endl;
ListTraverse(L);
cout<<endl;
i=4;
cout<<"将要删除的第"<<i<<"个元素为:";
cout<<DeleteElem(L, i, e);
cout<<endl;
cout<<"输出顺序表如下:"<<endl;
ListTraverse(L);
cout<<endl;
cout<<"-进行清空操作-"<<endl;
ClearList(L);
if( ListEmpty(L) == true )
cout<<"顺序表为空表"<<endl;
else
cout<<"顺序表不是空表"<<endl;
cout<<endl;
cout<<"-进行销毁操作-"<<endl;
DestroyList(L);
if( ListEmpty(L) == true )
cout<<"顺序表为空表"<<endl;
else
cout<<"顺序表不是空表"<<endl;
}
(2)用链式存储结构实现;
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList &L)
{
L=(LNode*)malloc(sizeof(LNode));
L->next =NULL;
}
void CreatList(LinkList &L)
{
int n,x;
LNode *p,*q;
p=L;
cout<<"-请输入单链表的长度-"<<endl;
scanf("%d",&n);
cout<<"-请逐个输入单链表的数据元素-"<<endl;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
q=(LNode*)malloc(sizeof(LNode));
q->data =x;
p->next =q;
p=q;
}
p->next =NULL;
}
void DestroyList(LinkList &L)
{
LNode *p;
p=L->next ;
while(p)
{
L->next =p->next;
free(p);
p=L->next ;
}
}
void ClearList(LinkList &L)
{
LNode *p;
p=L->next ;
while(p)
{
p->data=NULL;
p=p->next ;
}
}
bool ListEmpty(LinkList L)
{
if(L->next ==NULL)
return true;
else
return false;
}
int ListLength(LinkList L)
{
LNode *p;
p=L->next ;
int length=0;
while(p)
{
p=p->next ;
length++;
}
return length;
}
int GetElem(LinkList L,int i,ElemType &e)
{
LNode *p;
int j=0;
p=L->next ;
while(p)
{
p=p->next ;
j++;
if(i==j)
{
e=p->data ;
return e;
}
}
if(j>i)
{
printf("ERROR");
return 0;
}
return 0;
}
int LocateElem(LinkList L,ElemType &e)
{
LNode *p;
p=L->next ;
int i=1;
while(p)
{
if(p->data ==e)
return e;
else
{
p=p->next ;
i++;
}
}
return 0;
}
int PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
LNode *p,*q;
p=L->next ;
q=p->next ;
while(q)
{
if(q->data==cur_e)
{
pre_e=p->data ;
return pre_e;
}
else
{
p=q;
q=p->next ;
}
}
printf("ERROR");
return 0;
}
int NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
LNode *p,*q;
p=L->next ;
q=p->next ;
while(q)
{
if(p->data==cur_e)
{
next_e=q->data ;
return next_e;
}
else
{
p=q;
q=p->next ;
}
}
printf("ERROR");
return 0;
}
int ListTraverse(LinkList L)
{
LNode *p;
p=L->next ;
while(p)
{
printf("%d",p->data );
p=p->next ;
}
return 0;
}
int SetElem(LinkList &L,int i,ElemType &e)
{
LNode *p;
ElemType f;
f=e;
p=L->next ;
int j=1;
while(p)
{
if(i==j)
{
e=p->data ;
p->data =f;
return e;
}
else
{
p=p->next;
j++;
}
}
printf("ERROR");
return 0;
}
int InsertElem(LinkList &L,int i,ElemType &e)
{
LNode *p,*q;
int j=1;
LNode *s;
s=(LNode*)malloc(sizeof(LNode));
if(s==NULL)
exit(EOVERFLOW);
s->data=e;
q=L;
p=L->next ;
while(p)
{
if(j==i)
{
q->next =s;
s->next=p;
return 0;
}
else
{
q=p;
p=p->next ;
}
}
return 0;
}
int DeleteElem(LinkList &L,int i,ElemType &e)
{
LNode *p,*q;
int j=1;
q=L;
p=L->next ;
while(p)
{
if(j==i)
{
e=p->data ;
q->next =p->next ;
free(p);
return e;
}
else
{
q=p;
p=p->next ;
j++;
}
}
return 0;
}
int main()
{
LinkList L;
int i, n, x;
int &e=x ;
cout<<"-进行初始化操作-"<<endl;
InitList(L);
CreatList(L);
if( ListEmpty(L) == true )
cout<<"单链表为空表"<<endl;
else
cout<<"单链表不是空表"<<endl;
cout<<"单链顺序表如下:"<<endl;
ListTraverse(L);
cout<<endl;
cout<<"单链表长度为:";
cout<<ListLength(L);
cout<<endl;
i = 2;
cout<<"第"<<i<<"个数据元素为:";
cout<<GetElem(L, i, e);
cout<<endl;
x=3;
e=x;
cout<<"元素"<<e<<"所在的位置:";
cout<<LocateElem(L, e);
cout<<endl;
cout<<"元素"<<e<<"的前驱元素为:";
cout<<PriorElem(L, e, e);
cout<<endl;
cout<<"元素"<<e<<"的后继元素为:";
cout<<NextElem(L, e, e);
cout<<endl;
n = 4;
e = 7;
cout<<"第"<<n<<"个元素被"<<e<<"替换前的旧值为:";
cout<<SetElem(L, n, e);
cout<<endl;
cout<<"输出顺序表如下:"<<endl;
ListTraverse(L);
cout<<endl;
i=4;
cout<<"将要删除的第"<<i<<"个元素为:";
cout<<DeleteElem(L, i, e);
cout<<endl;
cout<<"输出顺序表如下:"<<endl;
ListTraverse(L);
cout<<endl;
cout<<"-进行清空操作-"<<endl;
ClearList(L);
if( ListEmpty(L) == true )
cout<<"单链表为空表"<<endl;
else
cout<<"单链表不是空表"<<endl;
cout<<endl;
cout<<"-进行销毁操作-"<<endl;
DestroyList(L);
if( ListEmpty(L) == true )
cout<<"单链表为空表"<<endl;
else
cout<<"单链表不是空表"<<endl;
}
更多推荐



所有评论(0)