链表的基本操作

来源:互联网 发布:董方卓为什么废了知乎 编辑:程序博客网 时间:2024/06/01 08:48
/*程序的版权和版本声明部分:*Copyright(c)2014,烟台大学计算机学院学生*All rights reserved.*文件名称:*作者:田成琳*完成日期:2014 年 9 月 8 日*版本号:v1.0*对任务及求解方法的描述部分:*问题描述:链表的简单应用*程序输入: -*程序输出:链表值*问题分析:*算法设计:*/#include<iostream>#include<cstdlib>using namespace std;struct LinkList{    int data;    struct LinkList *next;};void InitList(LinkList *&L);//初始化链表void CreateListF(LinkList *&L,int array[],int n);//头插法建立链表void CreateListR(LinkList *&L,int array[],int n);//尾插法建立链表 void DestoryList(LinkList *&L);//销毁链表bool ListEmpty(LinkList *L);//判段链表是否为空int ListLength(LinkList *L);//返回链表节点个数void DisplayList(LinkList *L);//输出链表每个节点的值bool GetElem(LinkList *L,int i,int &e);//查找某节点,其值赋给eint LocateElem(LinkList *L,int e);//查找某值,存在返回逻辑序号,否则返回0bool ListInsert(LinkList *&L,int i,int e);//插入元素bool ListDelete(LinkList *&L,int e);//删除元素void InitList(LinkList *&L){    L=(LinkList *)malloc(sizeof(LinkList));    L->next=NULL;}void CreateListF(LinkList *&L,int array[],int n){    LinkList *s;    L=(LinkList *)malloc(sizeof(LinkList));    L->next=NULL;  //创建头结点    for(int i=0;i<n;i++)//循环创建链表    {        s=(LinkList *)malloc(sizeof(LinkList));        s->data=array[i];        s->next=L->next;        L->next=s;    }}void CreateListR(LinkList *&L,int array[],int n){    LinkList *s,*r;    L=(LinkList *)malloc(sizeof(LinkList));    r=L;    for(int i=0;i<n;i++)    {        s=(LinkList *)malloc(sizeof(LinkList));        s->data=array[i];        r->next=s;        r=s;    }    r->next=NULL;}void DestoryList(LinkList *&L)//释放空间要逐一释放{    LinkList *pre=L,*p=L->next;//pre指向p的前驱节点    while(p!=NULL)//扫描L    {        free(pre);//先释放上一个节点        pre=p;        p=pre->next;//pre,p同时向后移动一个节点    }    free(pre);//循环结束,p为NULL,pre指向尾节点}bool ListEmpty(LinkList *L){    return (L->next==NULL);}int ListLength(LinkList *L){    int n=0;    LinkList *p=L;    while(p->next!=NULL)    {        n++;        p=p->next;    }    return n;}void DisplayList(LinkList *L){    LinkList *p=L->next;//p指向开始节点    while(p!=NULL)    {        cout<<p->data<<" ";        p=p->next;    }    cout<<endl;}bool GetElem(LinkList *L,int i,int &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,int e){    int i=1;    LinkList *p=L->next;    while(p!=NULL&&p->data!=e)    {        i++;        p=p->next;    }    if(p==NULL)        return (0);    else        return (i);}bool ListInsert(LinkList *&L,int i,int 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 e){    LinkList *p=L,*q;    while(p->next->data!=e&&p!=NULL)        p=p->next;    if(p==NULL)//链表为空        return false;    else        //找到了删除的前驱节点    {        q=p->next;      //q指向要删除的节点        if(q==NULL)            return false;        p->next=q->next;        free(q);        return true;    }}int main(){    LinkList *L;    int n,choose,del,ins,position;    cout<<"请输入要插入链表中值的个数:"<<endl;    cin>>n;    int *array = new int[n];    cout<<"请输入要插入链表中的值:"<<endl;    for(int i=0;i<n;i++)        cin>>array[i];    cout<<"请选择插入方法:"<<endl;    cout<<"1.正序插入"<<endl;    cout<<"2.倒序插入"<<endl;    cin>>choose;    if(choose==2)        CreateListF(L,array,n);    if(choose==1)        CreateListR(L,array,n);    if(ListEmpty(L))        cout<<"链表为空!"<<endl;    else    {        cout<<"链表不为空,链表中的值为:"<<endl;        DisplayList(L);    }    cout<<"请输入要插入链表元素的位置及元素"<<endl;    cin>>position>>ins;    ListInsert(L,position,ins);    cout<<"插入后链表中的值为:"<<endl;    DisplayList(L);    cout<<"请输入要删除链表的元素:"<<endl;    cin>>del;    ListDelete(L,del);    cout<<"删除后链表中的值为:"<<endl;    DisplayList(L);    return 0;}

运行结果:


0 0