数据结构实验(二)——线性表

实验一:

内容:

编写一个程序,实现顺序表的各种基本运算和整体建表算法(假设顺序表的元素类型ElemType为char),并在此基础上设计一个主程序,完成以下功能:

  1. 初始化顺序表L
  2. 依次插入a,b,c,d,e元素
  3. 输出顺序表L
  4. 输出顺序表L长度
  5. 判断顺序表L是否为空
  6. 输出顺序表L的第三个元素
  7. 输出元素a的位置
  8. 在第4个元素位置上插入f元素
  9. 输出顺序表L
  10. 10.删除顺序表L的第3个元素
  11. 输出顺序表L
  12. 释放顺序表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),并在此基础上设计一个程序,完成如下功能:

  1. 初始化单链表h
  2. 依次采用尾插法插入a,b,c,d,e元素
  3. 输出单链表h
  4. 输出单链表h的长度
  5. 判断单链表h是否为空
  6. 输出单链表h的第三个元素
  7. 输出元素a的位置
  8. 在第4个元素位置上插入f元素
  9. 输出单链表h
  10. 删除单链表h的第三元素
  11. 输出单链表h
  12. 释放单链表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; 

}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FFFPAG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值