花火ios
2021-09-25 23:30
采纳率: 100%
浏览 33

在删除单链表中x元素的结点,无法输入第二个字母,为什么

#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LNode,*LinkList;
LinkList creat(LinkList L)//头插法建立
{
    LinkList s;
    printf("请选择输入的个数:\n");
    int i,n;
    char m;
    scanf("%d",&n);

    for(i=0; i<n; i++)
    {
        s=(LinkList)malloc(sizeof(LNode));
        s->next=NULL;
        scanf("%s",m);
        s->data=m;
        s->next=L->next;
        L->next=s;

    }
    return L;
}
void PrintList(LinkList L)
{
    LinkList p;
    p=L->next;
    printf("链表元素如下:\n");
    while(p!=NULL)
    {
        printf("%s ",p->data);
        p=p->next;
    }
    printf("\n");
}
void DeleteList(LinkList L)
{
    LinkList p,q;
    p=L->next;
    while(p!=NULL)
    {
        if(strcmp(p->data,"x")!=0)
            p=p->next;
        else
        {
            q=(LinkList)malloc(sizeof(LNode));
            q=p->next;
            p->data=p->next->data;
            p->next=q->next;
            free(q);            p=p->next;
        }
    }
    printf("\n");
}
int main()
{
    LinkList L;

    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    L=creat(L);
    PrintList(L);
    printf("删除x的节点:\n");
    DeleteList(L);
    return 0;
}

  • 好问题 提建议
  • 收藏

2条回答 默认 最新

  • qzjhjxj 2021-09-26 10:35
    已采纳

    修改见注释,供参考:

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <string.h>
    
    typedef char ElemType;
    typedef struct LNode
    {
        ElemType data;
        struct LNode* next;
    } LNode, * LinkList;
    
    void creat(LinkList L)//头插法建立,修改  LinkList creat(LinkList L)
    {
        LinkList s;
        printf("请选择输入的个数:\n");
        int i, n;
                                    //char m;修改
        scanf("%d", &n);
        for (i = 0; i < n; i++)
        {
            s = (LinkList)malloc(sizeof(LNode));
            s->next = NULL;
            getchar();            //修改,吸收缓冲区多余字符
            scanf("%c", &s->data);//scanf("%s", m);修改
                                  //s->data = m;修改
            s->next = L->next;
            L->next = s;
        }
                                 //return L;  修改
    }
    void PrintList(LinkList L)
    {
        LinkList p;
        p = L->next;
        printf("链表元素如下:\n");
        while (p != NULL)
        {
            printf("%c ", p->data);//printf("%s ",p->data);修改
            p = p->next;
        }
        printf("\n");
    }
    
    void DeleteList(LinkList L, ElemType x) //修改
    {
        LinkList p, q;
        q = L;
        p = L->next;
        while (p != NULL)
        {
            if (p->data == x) {//if (strcmp(p->data, "x") != 0)修改
                q->next = p->next; // p = p->next; 修改
            //else
            //{
            //    q = (LinkList)malloc(sizeof(LNode));
            //    q = p->next;
            //    p->data = p->next->data;
            //    p->next = q->next;
                free(p); //修改
                break;
            }   
            q = p;
            p = p->next;
        }
        printf("\n");
    }
    int main()
    {
        LinkList L;
        ElemType x;       //修改
        L = (LinkList)malloc(sizeof(LNode));
        L->next = NULL;
        creat(L);        //L = creat(L); 修改
        PrintList(L);
    
        printf("输入需要删除的节点元素 x:\n");//修改
        getchar();        //修改
        scanf("%c", &x);  //修改 
        DeleteList(L,x); //修改
        PrintList(L);
    
        return 0;
    }
    
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • orange4reg 2021-09-26 00:10

    哥,你这个m是char类型啊,然后你scan成字符串那是肯定不行的呢。

    评论
    解决 无用
    打赏 举报