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
#include
#include
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;idata[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;ilength;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 (ilength&&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;jlength-1;j++)
L->data[j]=L->data[j+1];
L->length--;
return true;
}
int main()
{
SqList *L;
char e;
cout<<"(1)初始化顺序表L"<
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
#include
#include
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 (jnext;
}
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 (jnext;
}
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 (jnext;
}
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"<
6.编写一个程序,采用单链表表示集合(集合中不存在重复的元素),将其按递增方式排序,构成有序单链表。并求这样的两个集合的并、交和差。
#include
#include
#include
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;idata=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->datadata)
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->datadata)
{
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->datadata)
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->datadata)
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<<"集合的运算如下:"<