关于#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

错误太多,比如函数名写错,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;
}




不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

scanf("%d",&choose);
case 1: 不是case '1'