橘子嘻 2022-10-05 09:39 采纳率: 66.7%
浏览 32
已结题

关于#C语言#的问题,如何解决?

C语言书写单链表出现了致命错误,不知道怎么改

问题背景:
编写一个程序依次实现如下功能:
(1)在第i个元素之前插入一个元素e
(2)删除位序为i的元素,并将删除的节点的值由变量e返回;
(3)由变量e获取位序为i的元素的值;
(4)输出此表;
(5)退出程序时销毁此表。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define ok 1;
#define error 0;
typedef int ElemType;

typedef struct LNode
{
    ElemType data;
    struct Node * next;
}LNode,* LinkList;

void InitList_L(LinkList L) 
{ 
    L=(LinkList)malloc(sizeof(LNode));
    L->next = NULL; 
}

void CreateList_L(LinkList L, int n) 
{
    LNode *r,*s;//*r是尾指针
    ElemType c, flag=1;
    r=L;//动态指向当前表尾
    while(flag)
    {
        scanf("%d",&c);
        if(c!=0)
        {
            s=(LNode*)malloc(sizeof(LNode));
            s->data = c;
            r->next = s;
            r = s;
        } 
        else
        {
            flag=0;
            r->next=NULL; 
        }
    }
} 

int ListInsert_L(LinkList L, int i,ElemType e)//单链表的插入
{
    LNode *pre,*s;
    int k;
    pre=L;
    k=0;
    if(i<=0)
        return error;
    
    while(pre!=NULL&&k<i-1)
    {
        pre=pre->next;
        k=k+1;
    }//查找第i-1个结点
    if(pre==NULL)
        return error;
    s=(LNode*)malloc(sizeof(LNode));//申请一个新的结点
    s->data=e;//e放到s的数据域
    s->next=pre->next;//pre next域替换成 s next域
    pre->next=s; 
    return ok;
} 

int ListDelete_L(LinkList L, int i,ElemType *e) 
{
    LNode *pre,*r;
    int k; 
    pre=L;
    k=0;
    while(pre->next!=NULL&&k<i-1)
    {
        pre=pre->next;
        k=k+1;
    }
    if(pre->next==NULL)
    return error;
    r=pre->next;
    pre->next=r->next;
    *e=r->data;
    free(r);
    return ok; 
}

LNode *LocateElem_L(LinkList L, int e) 
{ 
    LinkList p;
    p = L->next;
    while (p && p->data!= e)
        p = p->next; 
    return p; 
}

    


int main() 
{
    int a, n,length;
    char choose;
    ElemType e;
    //LNode L;
    LinkList L, p;
    
    InitList(L);
    
    while (1) 
    {
        printf("1-- 建立\n");
        printf("2-- 输入\n");
        printf("3-- 插入\n");
        printf("4-- 删除\n");
        printf("5-- 查找\n");
        printf("6-- 输出\n");
        printf("0-- 退出\n\n");
        printf("请选择:");
        scanf("%d,&choose");

        switch (choose)
        {
        case '1': //建立一个单链表
            if (InitList_L(L))
                printf("成功建立链表!");
            break;
        case '2': //使用后插法创建单链表
            CreateList_L(L, length);
            printf("输入单链表\n\n");
            break;
        
        case '3': //单链表的插入
            printf("请输入元素插入的位置a:");
            scanf("%d;&a");
            printf("请输入待插入的元素e:");
            scanf("%d;&e");
    
            if (ListInsert_L(L, a, e))
                printf("插入成功.");
            else
                printf("插入失败!");
            break;
        case '4': //单链表的删除
            printf("请输入待删除元素的位置:");
            scanf("%d;&a");
            if (ListDelete_L(L, a, e))
                printf("删除成功!\n\n");
            else
                printf("删除失败!\n\n");
            break;
        case '5': //单链表的查找
            printf("请输入所要查找的位置:");
            scanf("%d;&a");
            if (LocateElem_L(L, a) != NULL) 
            {
                printf("查找成功  查找的值为:%d\n",LocateElem_L(L,a)->data);
                
            } else
                printf("查找失败! \n\n");
            break;
        case '6': //单链表的输出
            printf("该单链表的内容为:\n\n");
            p=L->next;
            while(L->next!=NULL)
            {
                printf("%d,L->next->date");
                L=L->next;
            }
            printf("\n");
            break;
        }
    }
    return 0;
}

运行结果及报错内容

img

  • 写回答

3条回答 默认 最新

  • 地球屋里老师 2022-10-05 09:52
    关注

    错误太多,比如函数名写错,scanf中语法错误。修改了大部分语法错误,但case '1': if (InitList_L(L)) 这一句 中,函数并没有返回值,需要你自己修改。

    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    #define ok 1;
    #define error 0;
    typedef int ElemType;
    
    typedef struct LNode
    {
      ElemType data;
      struct LNode* next;  //******Node 改为 LNode
    }LNode, * LinkList;
    
    void InitList_L(LinkList L)
    {
      L = (LinkList)malloc(sizeof(LNode));
      L->next = NULL;
    }
    
    void CreateList_L(LinkList L, int n)
    {
      LNode* r, * s;//*r是尾指针
      ElemType c, flag = 1;
      r = L;//动态指向当前表尾
      while (flag)
      {
        scanf("%d", &c);
        if (c != 0)
        {
          s = (LNode*)malloc(sizeof(LNode));
          s->data = c;
          r->next = s;
          r = s;
        }
        else
        {
          flag = 0;
          r->next = NULL;
        }
      }
    }
    
    int ListInsert_L(LinkList L, int i, ElemType e)//单链表的插入
    {
      LNode* pre, * s;
      int k;
      pre = L;
      k = 0;
      if (i <= 0)
        return error;
    
      while (pre != NULL && k < i - 1)
      {
        pre = pre->next;
        k = k + 1;
      }//查找第i-1个结点
      if (pre == NULL)
        return error;
      s = (LNode*)malloc(sizeof(LNode));//申请一个新的结点
      s->data = e;//e放到s的数据域
      s->next = pre->next;//pre next域替换成 s next域
      pre->next = s;
      return ok;
    }
    
    int ListDelete_L(LinkList L, int i, ElemType* e)
    {
      LNode* pre, * r;
      int k;
      pre = L;
      k = 0;
      while (pre->next != NULL && k < i - 1)
      {
        pre = pre->next;
        k = k + 1;
      }
      if (pre->next == NULL)
        return error;
      r = pre->next;
      pre->next = r->next;
      *e = r->data;
      free(r);
      return ok;
    }
    
    LNode* LocateElem_L(LinkList L, int e)
    {
      LinkList p;
      p = L->next;
      while (p && p->data != e)
        p = p->next;
      return p;
    }
    
    
    
    
    int main()
    {
      int a, n, length;
      char choose;
      ElemType e;
      //LNode L;
      LinkList L, p;
      InitList_L(L);  //******InitList(L); 函数名写错了
    
      while (1)
      {
        printf("1-- 建立\n");
        printf("2-- 输入\n");
        printf("3-- 插入\n");
        printf("4-- 删除\n");
        printf("5-- 查找\n");
        printf("6-- 输出\n");
        printf("0-- 退出\n\n");
        printf("请选择:");
        scanf("%c", &choose);//******scanf("%d,&choose"); 语法错误
    
        switch (choose)
        {
        case '1': //建立一个单链表
          if (InitList_L(L))
            printf("成功建立链表!");
          break;
        case '2': //使用后插法创建单链表
          CreateList_L(L, length);
          printf("输入单链表\n\n");
          break;
    
        case '3': //单链表的插入
          printf("请输入元素插入的位置a:");
          scanf("%d", &a);
          printf("请输入待插入的元素e:");
          scanf("%d", &e);
    
          if (ListInsert_L(L, a, e))
            printf("插入成功.");
          else
            printf("插入失败!");
          break;
        case '4': //单链表的删除
          printf("请输入待删除元素的位置:");
          scanf("%d", &a);
          if (ListDelete_L(L, a, &e))
            printf("删除成功!\n\n");
          else
            printf("删除失败!\n\n");
          break;
        case '5': //单链表的查找
          printf("请输入所要查找的位置:");
          scanf("%d", &a);
          if (LocateElem_L(L, a) != NULL)
          {
            printf("查找成功  查找的值为:%d\n", LocateElem_L(L, a)->data);
    
          }
          else
            printf("查找失败! \n\n");
          break;
        case '6': //单链表的输出
          printf("该单链表的内容为:\n\n");
          p = L->next;
          while (L->next != NULL)
          {
            printf("%d", L->next->data);
            L = L->next;
          }
          printf("\n");
          break;
        }
      }
      return 0;
    }
    
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月18日
  • 已采纳回答 10月10日
  • 修改了问题 10月5日
  • 创建了问题 10月5日

悬赏问题

  • ¥15 C#字典调用时报错,有关文件加载
  • ¥100 在连接内网VPN时,如何同时保持互联网连接
  • ¥15 MATLAB中使用parfor,矩阵Removal的有效索引在parfor循环中受限制
  • ¥20 Win 10 LTSC 1809版本如何无损提升到20H1版本
  • ¥50 win10 LTSC 虚拟键盘不弹出
  • ¥30 关于PHP中POST获取数据的问题
  • ¥30 微信小程序请求失败,网页能正常带锁访问
  • ¥15 Python实现hog特征图可视化
  • ¥30 德飞莱51单片机实现C4炸弹
  • ¥50 CrossLink-LIF-MD6000 型 FPGA 的 CMOS 转 MIPI D-PHY IP 核功能使用异常