您的位置:首页 > 其它

链表的基本操作

2014-09-08 15:38 489 查看
/*程序的版权和版本声明部分:
*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);//查找某节点,其值赋给e
int LocateElem(LinkList *L,int e);//查找某值,存在返回逻辑序号,否则返回0
bool 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
;
    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;
}

运行结果:

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