您的位置:首页 > 理论基础 > 数据结构算法

数据结构 - 简单的单链表结构

2016-03-30 17:31 549 查看
编写一个程序exp2-2.cpp,实现单链表的各种基本运算(假设单链表的元素类型为char),并在此基础上完成如下功能:

(1)初始化单链表h;

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

(3)输出单链表h;

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

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

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

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

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

(9)输出单链表h;

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

(11)输出单链表h;
(12)释放单链表h。

#include <iostream>
#include <cstdlib>
using namespace std;
struct LinkList
{
char data;
struct LinkList * next;
};
void InitList(LinkList *&);//初始化单链表
void CreateList(LinkList *&,char [],int);//尾插法插入单链表
void DispList(LinkList *);//输出单链表
int ListLength(LinkList *);//输出单链表长度
bool ListEmpty(LinkList *);//判断单链表是否为空
char GetElem(LinkList *,int);//输出单链表的第a个元素
int LocateElem(LinkList *,char);//输出某元素的位置
bool ListInsert(LinkList *&,int,char);//在某位置插入元素
bool ListDelete(LinkList *&,int);//删除某个元素
void DestroyList(LinkList *&);//释放单链表

int main()
{
char a[]="abcde";
cout<<"单链表的基本算法如下:"<<endl;
LinkList *L;
InitList(L);
cout<<"(1)初始化单链表H"<<endl;
CreateList(L,a,5);
cout<<"(2)依次采用尾插法插入a,b,c,d,e元素"<<endl;
cout<<"(3)输出单链表H:";
DispList(L);
cout<<"(4)单链表H长度="<<ListLength(L)<<endl;
cout<<"(5)单链表H为"<<(ListEmpty(L)?"":"非")<<"空"<<endl;
cout<<"(6)单链表H的第3个元素="<<GetElem(L,3)<<endl;
cout<<"(7)元素a的位置="<<LocateElem(L,'a')<<endl;
cout<<"(8)在第4个元素位置上插入f元素"<<(ListInsert(L ,4,'f')?"...Success":"...Failed")<<endl;
cout<<"(9)输出单链表H:";
DispList(L);
cout<<"(10)删除单链表H的第3个元素"<<(ListDelete(L,3)?"...Success":"...Failed")<<endl;
cout<<"(11)输出单链表H:";
DispList(L);
cout<<"(12)释放单链表H";
DestroyList(L);

}
void InitList(LinkList *&L)
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
void CreateList(LinkList *&L,char a[],int n)
{
LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0; i<n; i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void DispList(LinkList *L)
{
LinkList *p=L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int ListLength(LinkList *L)
{
int n=0;
LinkList *p=L;
while(p->next!=NULL)
{
n++;
p=p->next;
}
return n;
}
bool ListEmpty(LinkList *L)
{
return(L->next==NULL);
}
char GetElem(LinkList *L,int i)
{
int j=0;
LinkList *p=L;
while(j<i && p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
{
return '!';
}
else
{
return p->data;
}
}
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 1;
}
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)
{
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;
p->next=q->next;
free(q);
return true;
}
}
void DestroyList(LinkList *&L)
{
LinkList *pre=L,*p=L->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单链表