数据结构课程上机实验题(二)

2.1,编写一个程序exp2-1.cpp,实现顺序表的各种基本运算功能(假设顺序表的元素类型为char),并在此基础上完成如下功能:

(1)初始化顺序表L;

(2)采用尾插法依次插入元素a,b,c,d,e;

(3)输出顺序表L;

(4)输出顺序表L长度;

(5)判断顺序表L是否为空;

(6)输出顺序表L的第三个元素;

(7)输出元素a的位置;

(8)在第四个元素位置上插入元素f;

(9)输出顺序表;

(10)删除L的第三个元素;

(11)输出顺序表L;

(12)释放顺序表L;

代码如下:

#include <iostream>
#include <cstdio>
#include <malloc.h>
using namespace std;
#define MaxSize 50
typedef struct{
    char data[MaxSize];
    int length;
}SqList;

void CreateList(SqList *&L,char 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)
{
   int i;
   for (i=0;i<L->length;i++)
   {
       printf("%c ",L->data[i]);
   }
    printf("\n");
}

bool GetElem(SqList *L,int i,char &e)
{
    if (i<1|| i>L->length)
        return false;
    e=L->data[i-1];
    return true;
}

int LocateElem(SqList *L,char 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,char e)
{
    int j;
    if (i<1||i>L->length+1)
        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,char &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;

}

int main()
{
    SqList *L;
	char e;
	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;
	cout<<"(5)顺序表L为"<<(ListEmpty(L)?"空":"非空")<<endl;
	GetElem(L,3,e);
	cout<<"(6)顺序表L的第3个元素="<<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的第3个元素"<<endl;
    ListDelete(L,3,e);
	cout<<"(11)输出顺序表L:";
	DispList(L);
	cout<<"(12)释放顺序表L"<<endl;
	DestroyList(L);
    return 0;
}


2.编写程序exp2-2.cpp,实现单链表的各种基本运算(假设单链表的元素类型为char),并在此基础上完成如下功能;

(1)初始化单链表h;

(2)采用尾插法依次插入元素a,b,c,d,e;

(3)输出单链表h;

(4)输出单链表h长度;

(5)判断单链表h是否为空;

(6)输出单链表h的第三个元素;

(7)输出元素a的位置;

(8)在第四个元素位置上插入元素f;

(9)输出单链表h;

(10)删除h的第三个元素;

(11)输出单链表h;

(12)释放单链表h;

代码如下:

#include <iostream>
#include <cstdio>
#include <malloc.h>
using namespace std;
typedef struct LNode
{
	char data;
    struct LNode *next;
} LinkList;
void InitList(LinkList *&L)
{
	L=(LinkList *)malloc(sizeof(LinkList));
	L->next=NULL;
}
void DestroyList(LinkList *&L)
{
	LinkList *p=L,*q=p->next;
	while (q!=NULL)
	{
		free(p);
		p=q;
		q=p->next;
	}
	free(p);
}
bool ListEmpty(LinkList *L)
{
	return(L->next==NULL);
}
int ListLength(LinkList *L)
{
	LinkList *p=L;int i=0;
	while (p->next!=NULL)
	{
		i++;
		p=p->next;
	}
	return(i);
}
void DispList(LinkList *L)
{
	LinkList *p=L->next;
	while (p!=NULL)
	{
		printf("%c ",p->data);
		p=p->next;
	}
	printf("\n");
}
bool GetElem(LinkList *L,int i,char &e)
{
	int j=0;
	LinkList *p=L;
	while (j<i && p!=NULL)
	{	j++;
		p=p->next;
	}
	if (p==NULL)
		return false;
	else
	{	e=p->data;
		return true;
	}
}
int LocateElem(LinkList *L,char e)
{	int i=1;
	LinkList *p=L->next;
	while (p!=NULL && p->data!=e)
	{	p=p->next;
		i++;
	}
	if (p==NULL)
		return(0);
	else
		return(i);
}
bool ListInsert(LinkList *&L,int i,char e)
{
	int j=0;
	LinkList *p=L,*s;
	while (j<i-1 && p!=NULL)
	{	j++;
		p=p->next;
	}
	if (p==NULL)
		return false;
	else
	{	s=(LinkList *)malloc(sizeof(LinkList));
		s->data=e;
		s->next=p->next;
		p->next=s;
		return true;
	}
}
bool ListDelete(LinkList *&L,int i,char &e)
{
	int j=0;
	LinkList *p=L,*q;
	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;
	}
}

int main()
{
    LinkList *L;
	char e;
	cout<<"(1)初始化单链表h"<<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)输出单链表h:";
	DispList(L);
	cout<<"(4)单链表h长度="<<ListLength(L)<<endl;
	cout<<"(5)单链表h为"<<(ListEmpty(L)?"空":"非空")<<endl;
	GetElem(L,3,e);
	cout<<"(6)单链表h的第3个元素为"<<e<<endl;wew
	cout<<"(7)元素a的位置="<<LocateElem(L,'a')<<endl;
	cout<<"(8)在第4个元素位置上插入f元素"<<endl;
	ListInsert(L,4,'f');
	cout<<"(9)输出单链表h:";
	DispList(L);
	cout<<"(10)删除L的第3个元素"<<endl;
    ListDelete(L,3,e);
	cout<<"(11)输出单链表h:";
	DispList(L);
    cout<<"(12)释放单链表h"<<endl;
	DestroyList(L);
    return 0;
}

6.编写一个程序,采用单链表表示集合(集合中不存在重复的元素),将其按递增方式排序,构成有序单链表。并求这样的两个集合的并、交和差。

#include <iostream>
#include <cstdio>
#include <malloc.h>
using namespace std;

typedef struct LNode	//定义单链表结点类型
{
	char data;
    struct LNode *next;
} LinkList;
void DispList(LinkList *L)
{
	LinkList *p=L->next;
	while (p!=NULL)
	{
		printf("%c ",p->data);
		p=p->next;
	}
	printf("\n");
}
void DestroyList(LinkList *&L)
{
	LinkList *p=L,*q=p->next;
	while (q!=NULL)
	{
		free(p);
		p=q;
		q=p->next;
	}
	free(p);
}
void CreateListR(LinkList *&L,char a[],int n) //尾插法建表
{
	LinkList *s,*r;int i;
	L=(LinkList *)malloc(sizeof(LinkList));	//创建头结点
	L->next=NULL;
	r=L;						//r始终指向终端结点,开始时指向头结点
	for (i=0;i<n;i++)
	{
		s=(LinkList *)malloc(sizeof(LinkList));//创建新结点
		s->data=a[i];
		r->next=s;				//将*s插入*r之后
		r=s;
	}
	r->next=NULL;				//终端结点next域置为NULL
}
void sort(LinkList *&L)		//单链表元素递增排序
{
	LinkList *p,*pre,*q;
	p=L->next->next;		//p指向L的第2个数据节点
	L->next->next=NULL;		//构造只含一个数据节点的有序表
	while (p!=NULL)
	{	q=p->next;			//q保存*p节点后继节点的指针
		pre=L;				//从有序表开头进行比较,pre指向插入*p的前驱节点
		while (pre->next!=NULL && pre->next->data<p->data)
			pre=pre->next;	//在有序表中找插入*p的前驱节点*pre
		p->next=pre->next;	//将*pre之后插入*p
		pre->next=p;
		p=q;				//扫描原单链表余下的节点
	}
}

void Union(LinkList *ha,LinkList *hb,LinkList *&hc)  //求两有序集合的并
{
	LinkList *pa=ha->next,*pb=hb->next,*s,*tc;
	hc=(LinkList *)malloc(sizeof(LinkList));	//创建头结点
	tc=hc;
	while (pa!=NULL && pb!=NULL)
	{
		if (pa->data<pb->data)
		{
			s=(LinkList *)malloc(sizeof(LinkList));	//复制结点
			s->data=pa->data;
			tc->next=s;tc=s;
			pa=pa->next;
		}
		else if (pa->data>pb->data)
		{
			s=(LinkList *)malloc(sizeof(LinkList));	//复制结点
			s->data=pb->data;
			tc->next=s;tc=s;
			pb=pb->next;
		}
		else
		{
			s=(LinkList *)malloc(sizeof(LinkList));	//复制结点
			s->data=pa->data;
			tc->next=s;tc=s;
			pa=pa->next;	//重复的元素只复制一个
			pb=pb->next;
		}
	}
	if (pb!=NULL) pa=pb;	//复制余下的结点
	while (pa!=NULL)
	{
		s=(LinkList *)malloc(sizeof(LinkList));	//复制结点
		s->data=pa->data;
		tc->next=s;tc=s;
		pa=pa->next;
	}
	tc->next=NULL;
}
void InterSect(LinkList *ha,LinkList *hb,LinkList *&hc)	//求两有序集合的差
{
   LinkList *pa=ha->next,*pb,*s,*tc;
   hc=(LinkList *)malloc(sizeof(LinkList));
   tc=hc;
   while (pa!=NULL)
   {
	   pb=hb->next;
	   while (pb!=NULL && pb->data<pa->data)
		   pb=pb->next;
	   if (pb!=NULL && pb->data==pa->data)			//若pa结点值在B中
	   {
		   s=(LinkList *)malloc(sizeof(LinkList));	//复制结点
		   s->data=pa->data;
		   tc->next=s;tc=s;
	   }
	   pa=pa->next;
   }
   tc->next=NULL;
}
void Subs(LinkList *ha,LinkList *hb,LinkList *&hc)	//求两有序集合的差
{
   LinkList *pa=ha->next,*pb,*s,*tc;
   hc=(LinkList *)malloc(sizeof(LinkList));
   tc=hc;
   while (pa!=NULL)
   {
	   pb=hb->next;
	   while (pb!=NULL && pb->data<pa->data)
		   pb=pb->next;
	   if (!(pb!=NULL && pb->data==pa->data))		//若pa结点值不在B中
	   {
		   s=(LinkList *)malloc(sizeof(LinkList));	//复制结点
		   s->data=pa->data;
		   tc->next=s;tc=s;
	   }
	   pa=pa->next;
   }
   tc->next=NULL;
}
int main()
{
	LinkList *ha,*hb,*hc;
	char a[]={'d','a','e','b'};
	char b[]={'f','e','b','h','c','a'};
	cout<<"集合的运算如下:"<<endl;
	CreateListR(ha,a,4);
	CreateListR(hb,b,6);
	cout<<"原 集 合A: ";
	DispList(ha);
	cout<<"原 集 合B: ";
	DispList(hb);
	sort(ha);
	sort(hb);
	cout<<"有序集合A: ";
	DispList(ha);
	cout<<"有序集合B: ";
	DispList(hb);
	Union(ha,hb,hc);
	cout<<"集合的并集C: ";
	DispList(hc);
	InterSect(ha,hb,hc);
	cout<<"集合的交集C: ";
	DispList(hc);
	Subs(ha,hb,hc);
	cout<<"集合的差集C: ";
	DispList(hc);
	DestroyList(ha);
	DestroyList(hb);
	DestroyList(hc);
}






  • 22
    点赞
  • 71
    收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论 3

打赏作者

SAP 皮德憨

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值