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

来源:互联网 发布:天庭淘宝店无常 编辑:程序博客网 时间:2024/05/29 13:40
编写一个程序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);}
运行结果:

0 0