实验一:
内容:
编写一个程序,实现顺序表的各种基本运算和整体建表算法(假设顺序表的元素类型ElemType为char),并在此基础上设计一个主程序,完成以下功能:
- 初始化顺序表L
- 依次插入a,b,c,d,e元素
- 输出顺序表L
- 输出顺序表L长度
- 判断顺序表L是否为空
- 输出顺序表L的第三个元素
- 输出元素a的位置
- 在第4个元素位置上插入f元素
- 输出顺序表L
- 10.删除顺序表L的第3个元素
- 输出顺序表L
- 释放顺序表L
程序:
#include<iostream>
#include<malloc.h>
#define maxsize 50
using namespace std;
typedef char ElemType;
typedef struct{
ElemType data[maxsize];
int length;
}SqList;
void CreateList(SqList *&L,ElemType a[],int n){
L=(SqList *)malloc(sizeof(SqList));
for(int i=0;i<n;i++)
L->data[i]=a[i];
L->length=n;
}
void InitList(SqList *&L){
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
void DestroyList(SqList *&L){
free(L);
}
bool ListEmpty(SqList *L){
return(L->length==0);
}
int ListLength(SqList *L){
return(L->length);
}
void DispList(SqList *L){
for(int i=0;i<L->length;i++)
cout<<L->data[i]<<" ";
cout<<endl;
}
bool GetElem(SqList *L,int i,ElemType &e){
if(i<1||i>L->length)
return false;
e=L->data[i-1];
return true;
}
int LocateElem(SqList *L,ElemType e){
int i=0;
while(i<L->length&&L->data[i]!=e)
i++;
if(i>=L->length)
return 0;
else
return i+1;
}
bool ListInsert(SqList *&L,int i,ElemType e){
int j;
if(i<1||i>L->length+1||L->length==maxsize)
return false;
i--;
for(j=L->length;j>i;j--)
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++;
return true;
}
bool ListDelete(SqList *&L,int i,ElemType &e){
int j;
if(i<1||i>L->length)
return false;
i--;
e=L->data[i];
for(j=i;j<L->length-1;j++)
L->data[j]=L->data[j+1];
L->length--;
return true;
}
#include<iostream>
#include"sqlist.cpp"
using namespace std;
int main(){
SqList *L;
ElemType e;
cout<<"顺序表的基本运算如下:"<<endl;
cout<<"(1)初始化顺序表L"<<endl;
InitList(L);
cout<<"(2)依次插入a,b,c,d,e元素"<<endl;
ListInsert(L,1,'a');
ListInsert(L,2,'b');
ListInsert(L,3,'c');
ListInsert(L,4,'d');
ListInsert(L,5,'e');
cout<<"(3)输出顺序表L:";DispList(L);
cout<<"(4)顺序表L长度:"<<ListLength(L)<<endl;
printf("(5)顺序表L为%s\n",(ListEmpty(L)?"空":"非空"));
GetElem(L,3,e);
cout<<"(6)顺序表L的第三个元素:"<<e<<endl;
cout<<"(7)元素a的位置:"<<LocateElem(L,'a')<<endl;
cout<<"(8)在第4个元素位置上插入f元素"<<endl;
ListInsert(L,4,'f');
cout<<"(9)输出顺序表L:";DispList(L);
cout<<"(10)删除L的第三个元素"<<endl;
ListDelete(L,3,e);
cout<<"(11)输出顺序表L:";DispList(L);
cout<<"(12)释放顺序表L"<<endl;
DestroyList(L);
return 1;
}
运行结果:
实验二:
内容:
编写一个程序,实现单链表的各种基本运算和整体建表算法(假设单链表的元素类型ElemType为char),并在此基础上设计一个程序,完成如下功能:
- 初始化单链表h
- 依次采用尾插法插入a,b,c,d,e元素
- 输出单链表h
- 输出单链表h的长度
- 判断单链表h是否为空
- 输出单链表h的第三个元素
- 输出元素a的位置
- 在第4个元素位置上插入f元素
- 输出单链表h
- 删除单链表h的第三元素
- 输出单链表h
- 释放单链表h
程序:
#include<iostream>
#include<malloc.h>
using namespace std;
typedef char ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LinkNode;
void CreateListF(LinkNode *&L,ElemType a[],int n){
LinkNode *s;
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
for(int i=0;i<n;i++){
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a[i];
s->next=L->next;
L->next=s;
}
}
void CreateListR(LinkNode *&L,ElemType a[],int n){
LinkNode *s,*r;
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
r=L;
for(int i=0;i<n;i++){
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void InitList(LinkNode *&L){
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
}
void DestroyList(LinkNode *&L){
LinkNode *pre=L,*p=pre->next;
while(p!=NULL){
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
bool ListEmpty(LinkNode *L){
return(L->next==NULL);
}
int ListLength(LinkNode *L){
int i=0;
LinkNode *p=L;
while(p->next!=NULL){
i++;
p=p->next;
}
return(i);
}
void DispList(LinkNode *L){
LinkNode *p=L->next;
while(p!=NULL){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
bool GetElem(LinkNode *L,int i,ElemType &e){
int j=0;
LinkNode *p=L;
if(i<=0)return false;
while(j<i&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL){
return false;
}
else{
e=p->data;
return true;
}
}
int LocateElem(LinkNode *L,ElemType e){
int i=1;
LinkNode *p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
i++;
}
if(p==NULL){
return(0);
}
else
return(i);
}
bool ListInsert(LinkNode *&L,int i,ElemType e){
int j=0;
LinkNode *p=L,*s;
if(i<=0) return false;
while(j<i-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL){
return false;
}else
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
bool ListDelete(LinkNode *&L,int i,ElemType &e){
int j=0;
LinkNode *p=L,*q;
if(i<=0) return false;
while(j<i-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL)
return false;
else{
q=p->next;
if(q==NULL)
return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}
#include"linknode.cpp"
int main(){
LinkNode *h;
ElemType e;
cout<<"单链表的基本运算如下:"<<endl;
cout<<" (1)初始化单链表h"<<endl;
InitList(h);
cout<<" (2)依次采用尾插法插入a,b,c,d,e元素"<<endl;
ListInsert(h,1,'a');
ListInsert(h,2,'b');
ListInsert(h,3,'c');
ListInsert(h,4,'d');
ListInsert(h,5,'e');
cout<<" (3)输出单链表h:";DispList(h);
cout<<" (4)单链表h长度:"<<ListLength(h)<<endl;
printf(" (5)单链表h为%s\n",(ListEmpty(h)?"空":"非空"));
GetElem(h,3,e);
cout<<" (6)单链表的第三个元素为:"<<e<<endl;
cout<<" (7)元素a的位置:"<<LocateElem(h,'a')<<endl;
cout<<" (8)在第四个元素位置上插入f元素"<<endl;
ListInsert(h,4,'f');
cout<<" (9)输出单链表h:";DispList(h);
cout<<" (10)删除h的第三个元素"<<endl;
ListDelete(h,3,e);
cout<<" (11)输出单链表h:";DispList(h);
cout<<" (12)释放单链表h"<<endl;
DestroyList(h);
return 1;
}
运行结果: