单链表主要表达式错误

我在行display(struct node* ptr);的显示函数的开关情况下得到错误, “期望在结构之前的主要表达式” display(struct node* ptr);

谁能解释为什么?

#include<stdio.h>
#include<malloc.h>

void insbeg();
void delmid();
void display(struct node* ptr);

struct node
{
    int data;
    struct node* next;
}* start=NULL;

int main()
{
    int n;
    printf("1-insbegn");
    printf("2-delmidn");
    printf("3-displayn");
    scanf("%d",&n);

    switch(n)
    {
    case 1:
        insbeg();
        break;
    case 2:
        delmid();
        break;
    case 3:
        display(struct node* ptr);
        break;  
    }
}

void insbeg()
{
    struct node* new1;
    int x;
    new1 = (struct node*)malloc(sizeof (struct node));

    printf("enter the data:");
    scanf("%d",&x);
    new1->data = x;

    if(start == NULL)
    {
        new1->next = NULL;
        start=new1;
    } else {
        new1->next = start;
        start = new1;
    }

}

void delmid()
{
    struct node* prev,* ptr;
    int pos, i;

    printf("enter the position:");
    scanf("%d",&pos);
    ptr = start;

    for(i = 1;i <= pos; i++){
        prev = ptr;
        ptr = ptr->next;
    }

    prev->next = ptr->next;
    free(ptr);
}

void display(struct node* ptr)
{
    ptr = start;
    display(ptr->next);
    printf("%d",ptr->data);
}

在switch语句的struct node* ptr情况下调用display时,您需要传递一个节点指针,而不是写入不构成节点或节点指针的struct node* ptr

您想要传递的节点指针是您已经定义的节点, start

原始case 3: -

case 3:
    display(struct node* ptr);
    break;  

case 3: -

case 3:
    display(start);
    break;  

这将解决你得到的错误,但还有一个问题。

display函数是递归的,所有的递归函数都需要一个基本情况或一个停止点。 只要ptr->nextnull ,您就需要停止display来调用它自己。 只需将if语句添加到当前的代码中即可。

你当前的display函数也是ptr=start ,但是如果ptr被设置为每次调用该函数时start ,该函数将永远调用它自己并传入ptr->next ,这与start->next是一样的,因为你只是分配startptr 。 所以行ptr=start是没有必要的。 为了让显示功能从头到尾遍历所有节点,只需在第一次调用该函数时start开关,在开关的情况3下(我们刚刚做过)。

原始display功能:

void display(struct node* ptr)
{
    ptr=start;
    display(ptr->next);
    printf("%d",ptr->data);
}

display功能与基本情况

void display(struct node* ptr)
{
    if(ptr->next != NULL) {
        display(ptr->next);
    }    

    printf("%d",ptr->data);
}



与您的问题不完全相关,我注意到有几个样式问题

您需要确保您的代码遵循风格指南,如下所列。 一些需要注意的重要事项是缩进,间距和变量/类命名约定。 最重要的是,选择一种风格并持续使用它。

我注意到你可能想看的一些事情:

  • 给变量赋值,你写这行像int x=1; 。 大多数风格指南建议在=之前和之后使用空格,例如: int x = 1;

  • 上面的提示也适用于其他代码段,比如for循环。 在代码的行表示为: for(i=1;i<=pos;i++){但是这可能看起来更好为: for(i = 1; i <= pos; i++){

  • 当你声明多个变量时,除非它们属于同一类型,否则应该在不同的行上进行声明。 在这一行struct node* new1; int x; struct node* new1; int x; ,你应该把struct node* new1;int x; 分开行。

  • 命名变量非常重要。 变量的名称应该描述或至少暗示变量的目的。 像new1x这样的名称不是很具描述性,但像currentNodenodeValue这样的名称是。

  • 在类似的代码组之间应该有足够的空白,以使代码更具可读性:

  • 原始细分:

    printf("enter the position:");
    scanf("%d",&pos);
    ptr=start;
    for(i=1;i<=pos;i++){
        prev=ptr;
        ptr=ptr->next;
    }
    prev->next=ptr->next;
    free(ptr);
    

    间距:

    printf("enter the position:");
    scanf("%d",&pos);
    
    ptr = start;
    for(i = 1; i <= pos; i++){
        prev = ptr;
        ptr = ptr->next;
    }
    
    prev->next = ptr->next;
    free(ptr);
    

    这些只是我认为我应该指出的几件事情。 样式化代码时,应该考虑更多的事情。 但请记住,你可以做的最重要的事情是选择一种风格并坚持下去!

    当然,这些只是我喜欢使用/遵循的建议和提示。 没有完美的答案,因此我的答案并不完美。 你不应该把我的建议当作唯一的方法,而应该用它来帮助形成你的观点。 看看你认为我错了什么,并想想如何改进我的答案。 找到你的风格。

    绝对看看这个伟大的职位,这些技巧,这篇文章的代码风格/可读性的更多信息。


    在调用display您必须将指针传递给节点。 指针必须在调用之前定义,因为你不能在函数调用中定义一个新变量(这正是你现在正在做的)。

    很可能你想显示整个列表,所以你应该通过start

    所以,而不是

        case 3:display(struct node* ptr);
            break;
    

    它应该是

        case 3:display(start);  // Pass start
            break;
    

    进一步你的display功能不正确。 不要执行assign ptr=start因为这会导致无限循环(当您用完堆栈时会导致程序崩溃)。

    所以,而不是

     void display(struct node* ptr)
     {
        ptr=start;
        display(ptr->next);
        printf("%d",ptr->data);
    }
    

    它应该是

    void display(struct node* ptr)
    {
        if (ptr == NULL) return;  // End the recursive function when ptr is NULL
    
        display(ptr->next);       // Recursive call to print the list backwards
        printf("%d",ptr->data);
    }
    
    链接地址: http://www.djcxy.com/p/84397.html

    上一篇: single linked list primary expression error

    下一篇: Expected ' ' before '=' token in struct definition