生异形吗你哥俩 2024-10-04 11:10 采纳率: 71.4%
浏览 4
已结题

删除s的前驱节点,但是不知道错哪里了

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Lnode
{
    int data;
    struct Lnode *next;
}ListNode,*LinkList;

LinkList Creatail()
{
    LinkList L,r,s;
    int x;
    L=(LinkList)malloc(sizeof(ListNode));
    r=L;
    scanf("%d",&x); 
    while(x!=0)
    {
        r->data=x;
        s=(LinkList)malloc(sizeof(ListNode));
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    r->next=L;
    return L;
}

void Print(LinkList L)
{
    LinkList p;
    p=L;
    while(p->next!=L)
    {
        printf("%d ",p->data);
        p=p->next;
    }
}

void Delet(LinkList L,LinkList s)
{
    LinkList p,q;
    p=s->next,q=s;
    while(p->next!=s)
    {
        q=p;
        p=p->next;
    }
    q->next=p->next;
    free(p);
}

int main()
{
    LinkList L,s;
    int i,j;
    L=Creatail();
    Print(L);
    printf("\n");
    s=L;
    printf("你想要删除哪个位置的前驱:");
    scanf("%d",&j);
    for(i=1;i<j;i++)
    s=s->next;
    Delet(L,s);
    Print(L);
    return 0;
}

img

img


代码的本意是删除s元素的前驱节点,实验数据为1 2 3 4 5 6,每次删除第二个位置的前驱结点就有问题,但是其它的没有问题,不知道错哪了。
原题目如下:
假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表某个结点的指针,试编写算法在链表中删除指针s所指结点的前趋结点。
[提示]:设指针p指向s结点的前趋的前趋,则p与s有何关系?
要求:必须在我的代码基础上进行修改,否则不予采纳

  • 写回答

11条回答 默认 最新

  • micthis 2024-10-04 14:15
    关注

    运行截图:

    img


    为了防止人机抄袭,评论后给代码。
    追加代码:

    #include<stdio.h>
    #include<stdlib.h>
    typedef int ElemType;
    typedef struct Lnode
    {
        int data;
        struct Lnode *next;
    }ListNode,*LinkList;
    LinkList Creatail()
    {
        LinkList L,r,s;
        int x;
        scanf("%d",&x);
        L=NULL;
        while(x!=0)
        {
            s=(LinkList)malloc(sizeof(ListNode));
            s->data=x;
            if(!L)
                L=s;
            else
                r->next=s;
            r=s;
            scanf("%d",&x);
        }
        r->next=L;
        return L;
    }
    void Print(LinkList L)
    {
        LinkList p;
        if(!L)
        {
            printf("空链表");
            return;
        }
        p=L;
        while(p)
        {
            printf("%d ",p->data);
            p=p->next;
            if(p==L)
                break;
        }
    }
    LinkList Delet(LinkList L,LinkList s)
    {
        LinkList p,q;
        if(!s)
            return L;
        p=s->next,q=s;
        while(p->next!=s)
        {
            q=p;
            p=p->next;
        }
        if(q==p)
            L=NULL;
        else if(p==L)
            L=L->next;
        q->next=p->next;
        free(p);
        return L;
    }
    int main()
    {
        LinkList L,s;
        int i,j;
        L=Creatail();
        Print(L);
        printf("\n");
        while(1)
        {
            printf("你想要删除哪个位置的前驱(-1退出循环):");
            scanf("%d",&j);
            if(j==-1)
                break;
            if(j>0)
            {
                s=L;
                for(i=1;s&&i<j;i++)
                    s=s->next;
                L=Delet(L,s);
                Print(L);
                printf("\n");
            }
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(10条)

报告相同问题?

问题事件

  • 系统已结题 10月12日
  • 已采纳回答 10月4日
  • 修改了问题 10月4日
  • 赞助了问题酬金15元 10月4日
  • 展开全部