双向链表的建立,增加,删除操作

/*程序的版权和版本声明部分:
*Copyright(c)2014,烟台大学计算机学院学生
*All rights reserved.
*文件名称:
*作者:田成琳
*完成日期:2014 年 9 月 11 日
*版本号:v1.0
*对任务及求解方法的描述部分:
*问题描述:链表的简单应用
*程序输入: -
*程序输出:链表值
*问题分析:
*算法设计:
*/
#include<iostream>
#include<cstdlib>
using namespace std;
struct LinkList
{
    int data;
    struct LinkList *next;//后驱
    struct LinkList *front;//前驱
};
void CreateListF(LinkList *&L,int array[],int n);//头插法建立链表
void CreateListR(LinkList *&L,int array[],int n);//尾插法建立链表 
bool ListInsert(LinkList *&L,int i,int e);//插入e元素在i位置
bool ListDelete(LinkList *&L,int e);//删除e元素
void ListDisplay(LinkList *&L);//显示元素
void CreateListF(LinkList *&L,int array[],int n)
{
    LinkList *s;
    L=(LinkList *)malloc(sizeof(LinkList));
    L->front=L->next=NULL;     //L前后置空
    for(int i=0; i<n; i++) //循环创建链表
    {
        s=(LinkList *)malloc(sizeof(LinkList));
        s->data=array[i];
        s->next=L->next;
        if(L->next!=NULL)   //第一次循环不进行
            L->next->front=s;
        L->next=s;
        s->front=L;
    }
}
void CreateListR(LinkList *&L,int array[],int n)
{
    LinkList *s,*r;
    L=(LinkList *)malloc(sizeof(LinkList));
    r=L;  //r指向尾节点,开始时指向头结点
    for(int i=0; i<n; i++)
    {
        s=(LinkList *)malloc(sizeof(LinkList));
        s->data=array[i];
        r->next=s;
        s->front=r;
        r=s;
    }
    r->next=NULL;
}
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       //找到了第i-1个节点
    {
        s=(LinkList *)malloc(sizeof(LinkList));
        s->data=e;
        s->next=p->next;//修改指针指向
        if(p->next!=NULL)//p->next不是空节点则s后没有指向的指针
            p->next->front=s;
        s->front=p;
        p->next=s;
        return true;
    }
}
bool ListDelete(LinkList *&L,int e)
{
    LinkList *p=L,*q;
    while(p->data!=e&&p!=NULL)
        p=p->next;
    p=p->front;//指针位置到了要删除的元素,所以要前移一个
    if(p==NULL)
        return false;
    else
    {
        q=p->next;
        if(q==NULL)
            return false;
        p->next=q->next;
        if(p->next!=NULL)
            p->next->front=p;
        free(q);
    }
    return true;
}
void ListDisplay(LinkList *&L)
{
    LinkList *p=L->next;//p指向开始节点
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}
int main()
{
    LinkList *L;
    int n,choose,position,number;
    cout<<"请输入数字个数及数字:"<<endl;
    cin>>n;
    int *array=new int[n];
    for(int i=0; i<n; i++)
        cin>>array[i];
    cout<<"请选择插入方法:"<<endl;
    cout<<"1.正序插入."<<endl;
    cout<<"2.倒序插入."<<endl;
    cin>>choose;
    if(choose==1)
    {
        cout<<"使用尾插法建立的双向链表为:"<<endl;
        CreateListR(L,array,n);
        ListDisplay(L);
    }
    if(choose==2)
    {
        cout<<"使用头插法建立的双向链表为:"<<endl;
        CreateListF(L,array,n);
        ListDisplay(L);
    }
    cout<<"请输入要插入链表中的元素位置及元素:"<<endl;
    cin>>position>>number;
    ListInsert(L,position,number);
    cout<<"插入后链表中的元素为:"<<endl;
    ListDisplay(L);
    cout<<"请输入要插删除的链表中的元素:"<<endl;
    cin>>number;
    ListDelete(L,number);
    cout<<"删除后链表中的元素为:"<<endl;
    ListDisplay(L);
    return 0;
}

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值