单链表主要表达式错误
我在行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->next
为null
,您就需要停止display
来调用它自己。 只需将if语句添加到当前的代码中即可。
你当前的display
函数也是ptr=start
,但是如果ptr
被设置为每次调用该函数时start
,该函数将永远调用它自己并传入ptr->next
,这与start->next
是一样的,因为你只是分配start
到ptr
。 所以行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;
分开行。
命名变量非常重要。 变量的名称应该描述或至少暗示变量的目的。 像new1
或x
这样的名称不是很具描述性,但像currentNode
和nodeValue
这样的名称是。
在类似的代码组之间应该有足够的空白,以使代码更具可读性:
原始细分:
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