双向链表

题目描述

构建一个双向链表并进行删除和插入操作,按要求输出。

输入

输入:

第一行输入元素个数M

第二行输入M个元素

第三行输入删除位置

第四行输入插入位置和插入元素

第五行输入输出时的起始位置

输出

按要求的起始位置输出链表

样例输入

8
1 2 3 4 5 6 7 8
6
6 6
5

样例输出

5 6 7 8 1 2 3 4

分析:

此题考察链表的多方面知识。我在此题卡了一个早上,真吓人。
分析一下我卡的原因,一是为考虑根本不需要删除的时候怎么办(即第三行直接换行 )。然后插入的时候出入的的位置是最后一个数的后面怎么办。

#include"stdio.h"
#include"string.h"
typedef struct a{
  long long data;
  long long subscript;
  struct a *pre;
  struct a *next;
}*LinkList,Node;
//创建一个链表
void CreateListTail(LinkList *L,long long n)
{
    LinkList p,r;
    long long i;
    (*L)=(LinkList)malloc(sizeof(Node));
    r=(*L);
    for(i=1;i<=n;i++)
    {
        p=(LinkList)malloc(sizeof(Node));
        scanf("%lld",&(p->data));
        p->subscript=i;
        p->pre=r;
        r->next=p;
        r=p;
    }
    r->next=(*L)->next;
    (*L)=(*L)->next;
    (*L)->pre=r;
}
//删除指点结点
void Delete(LinkList *L,long long DeleteLocation)
{
    LinkList pre,T;
    pre=*L;T=*L;
    if(DeleteLocation==1)
    {   T->pre->next=T->next;
        *L=pre->next;
        T->next->pre=T->pre;

    }
    else
    {/*while(T->subscript!=DeleteLocation)
    {
        pre=T;
        T=T->next;
    }*/
    DeleteLocation--;
    while(DeleteLocation--)
    {
        pre=T;
        T=T->next;
    }

    T->next->pre=pre;
    pre->next=T->next;
    }
}
//在指定位置插入一个指定的值
void Insert(LinkList *L,long long InsertionPosition,long long digit)
{
    LinkList pre,T,P;
    P=(LinkList)malloc(sizeof(Node));
    P->data=digit;
    P->subscript=InsertionPosition;
    P->next=NULL;
    P->pre=NULL;
    T=*L;
    pre=*L;
    if(InsertionPosition==1)
    {
        T->pre->next=P;
        P->pre=T->pre;
        P->next=T;
        T->pre=P;
        *L=P;


    }
    else
    {while(T->subscript<InsertionPosition&&pre->subscript<=T->subscript)
    {
        pre=T;
        T=T->next;
    }
    if(pre->subscript>T->subscript)
    {
        P->next=T;
        T->pre=P;
        pre->next=P;
        P->pre=pre;
    }
    else
    {pre->next=P;
    P->pre=pre;
    P->next=T;
    T->pre=P;
    }
    }
}
//刷新该结点的链表的位置值
void Plash(LinkList *L)
{
    LinkList T;
    long long count=1;
    T=*L;
    T->subscript=count;
    T=T->next;
    while(T!=*L)
    {
        T->subscript=++count;
        T=T->next;
    }
}
//从指定的位置输出
void PUSH(LinkList *L,long long Mark,long long number)
{
    LinkList T,P;
    T=*L;
    P=T;
   /* while(T->subscript<Mark)
    {
        T=T->next;
    }*/
    Mark--;
    while(Mark--)
    {
        T=T->next;
    }
    P=T->pre;
    while(T!=P)
    {
        printf("%lld ",T->data);
        T=T->next;
    }

    printf("%d \n",T->data);
}
int main()
{
    LinkList L,P;
    long long m,i,InsertionPosition,DeleteLocation,digit,Mark,q;
    char DeleteLocation1,c;
    while(~scanf("%lld",&m))
    {  q=0;
        CreateListTail(&L,m);
        scanf("%c",&c);
        scanf("%c",&DeleteLocation1);
        DeleteLocation=DeleteLocation1-'0';
        if(DeleteLocation>=1&&DeleteLocation<=m)
        {Delete(&L,DeleteLocation);q=1;}

        Plash(&L);

        scanf("%lld%lld",&InsertionPosition,&digit);

        Insert(&L,InsertionPosition,digit);
        Plash(&L);
        scanf("%lld",&Mark);

        PUSH(&L,Mark,m+q);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值