C “双链表返回”;“列表为空”;

C “双链表返回”;“列表为空”;,c,C,我是C语言的初学者,试图通过char变量创建双链表。我在单张单子上也做了同样的事情。然而,当我在双重列表中做同样的事情时,我的检查函数检查列表是否为空,返回列表为空,因此我的列表不是由打印函数写入的。我读过一些与我的问题相关的帖子,我认为这是关于指针的引用,但我无法解决我的问题。由于这是我的第一篇文章,英语不是我的母语,我为偶尔的不完美感到抱歉。所以请提醒我我的错误,以便正确地分享帖子。任何帮助都将不胜感激 #include <stdio.h> #include <stdlib

我是C语言的初学者,试图通过char变量创建双链表。我在单张单子上也做了同样的事情。然而,当我在双重列表中做同样的事情时,我的检查函数检查列表是否为空,返回列表为空,因此我的列表不是由打印函数写入的。我读过一些与我的问题相关的帖子,我认为这是关于指针的引用,但我无法解决我的问题。由于这是我的第一篇文章,英语不是我的母语,我为偶尔的不完美感到抱歉。所以请提醒我我的错误,以便正确地分享帖子。任何帮助都将不胜感激

#include <stdio.h>
#include <stdlib.h>


typedef struct node{
char val;

struct node *next;
struct node *prev;

}node_t;




void pushFront(node_t  *nodes);
int isEmpty(node_t *nodes);
void printList(node_t *nodes);
void pushBack(node_t *nodes);

int main(void)
{

node_t *head=NULL;  //My head node

pushFront(head);
pushBack(head);
printList(head);
}



int isEmpty(node_t *nodes)//Checking whether node is empty or not.
{
node_t *current=nodes;
if(current==NULL)
{
    return 1;
}
else
{
    return 0;
}
}

void pushFront(node_t *nodes)
{

node_t *newNode;
char b;
int i;

do{
printf("Enter a char:");//Getting character from user
scanf(" %c",&b);

if(isEmpty(nodes))//If node is empty then create
{
    newNode=malloc(sizeof(node_t));
    newNode->val=b;
    newNode->next=NULL;
    newNode->prev=NULL;

    nodes=newNode;

}


else//if it is not empty, get new first character
{
    newNode=malloc(sizeof(node_t));
    newNode->val=b;
    nodes->prev=newNode;
    newNode->next=nodes;
    nodes=newNode;

}
printf("Enter a -1 to exit:");//If user wants to continue to add head 
character
scanf("%d",&i);


}while(i!=-1);
}



void pushBack(node_t *nodes)//adding character to back of head
{
node_t *current=nodes;
char b;
int i;

do{
    printf("Enter a char:");
    scanf(" %c",&b);

    if(isEmpty(nodes))//checking again empty or not
    {
        node_t *newNode=malloc(sizeof(node_t));
        newNode->val=b;
        newNode->next=NULL;
        newNode->prev=NULL;
        nodes=newNode;
    }
    else//if not empty
    {
        while(current->next!=NULL)
        {
            current=current->next;
        }
        current->next=malloc(sizeof(node_t));
        current->next->val=b;
        current->next->prev=current;
        current->next->next=NULL;
    }
    printf("Enter -1 to exit:");
    scanf("%d",&i);
    }while(i!=-1);
    }

    void printList(node_t *nodes)//Printing all the characters
    {

    if(isEmpty(nodes))
    {
    printf("List is empty");
    }
    else
    {
    while(nodes!=NULL)
    {
        printf("%c",nodes->val);
        nodes=nodes->next;
    }
    }
    }
#包括
#包括
类型定义结构节点{
char-val;
结构节点*下一步;
结构节点*prev;
}节点t;
void pushFront(节点_t*节点);
int isEmpty(node_t*nodes);
无效打印列表(节点*nodes);
无效回推(节点×节点);
内部主(空)
{
node_t*head=NULL;//我的头节点
前端(头部);
推回(头);
印刷品清单(标题);
}
int isEmpty(node\u t*nodes)//检查节点是否为空。
{
node_t*current=节点;
如果(当前==NULL)
{
返回1;
}
其他的
{
返回0;
}
}
void pushFront(节点*node)
{
node_t*newNode;
字符b;
int i;
做{
printf(“输入字符:”;//从用户处获取字符
scanf(“%c”和“b”);
if(isEmpty(nodes))//如果节点为空,则创建
{
newNode=malloc(sizeof(node_t));
newNode->val=b;
newNode->next=NULL;
newNode->prev=NULL;
节点=新节点;
}
else//如果它不是空的,则获取新的第一个字符
{
newNode=malloc(sizeof(node_t));
newNode->val=b;
节点->上一个=新节点;
newNode->next=节点;
节点=新节点;
}
printf(“输入-1退出:”;//如果用户想继续添加头部
性格
scanf(“%d”、&i);
}而(i!=-1);
}
void pushBack(node_t*nodes)//将字符添加到头部后部
{
node_t*current=节点;
字符b;
int i;
做{
printf(“输入字符:”);
scanf(“%c”和“b”);
if(isEmpty(nodes))//再次检查是否为空
{
node_t*newNode=malloc(sizeof(node_t));
newNode->val=b;
newNode->next=NULL;
newNode->prev=NULL;
节点=新节点;
}
else//如果不是空的
{
while(当前->下一步!=NULL)
{
当前=当前->下一步;
}
当前->下一步=malloc(sizeof(node_t));
当前->下一个->值=b;
当前->下一个->上一个=当前;
当前->下一步->下一步=空;
}
printf(“输入-1以退出:”);
scanf(“%d”、&i);
}而(i!=-1);
}
void printList(node_t*nodes)//打印所有字符
{
if(isEmpty(节点))
{
printf(“列表为空”);
}
其他的
{
while(节点!=NULL)
{
printf(“%c”,节点->val);
节点=节点->下一步;
}
}
}

这不是答案,但应该给你一个提示:

问题:

void Foo(int bar)
{
  bar = bar * 2;
}

...
int x = 3;
Foo(x);
// what's the value of x here ?
调用
Foo(x)
x
的值是多少


嗯,同样的事情也发生在
pushFront
,和
pushBack
,这不是答案,但它应该给你一个提示:

问题:

void Foo(int bar)
{
  bar = bar * 2;
}

...
int x = 3;
Foo(x);
// what's the value of x here ?
调用
Foo(x)
x
的值是多少


嗯,同样的事情也发生在
pushFront
,和
pushBack

你的“修复我的代码”问题在这里是离题的。使用所有警告和调试信息(例如,
gcc-Wall-Wextra-g
with…)进行编译,然后使用调试器(例如,
gdb
)逐步运行程序并查询其状态,从而了解您的bug。
void pushFront(node\t*nodes)-->
节点*pushFront(节点*node)
推前(头部)-->
头部=前推(头部)@BasileStarynkevitch,是的,你是对的。我将按照以下步骤进行操作。您的“修复我的代码”问题已脱离主题。使用所有警告和调试信息(例如,
gcc-Wall-Wextra-g
with…)进行编译,然后使用调试器(例如,
gdb
)逐步运行程序并查询其状态,从而了解您的bug。
void pushFront(node\t*nodes)-->
节点*pushFront(节点*node)
推前(头部)-->
头部=前推(头部)@BasileStarynkevitch,是的,你是对的。我将按照以下步骤操作。函数调用后它将变为6。我明白了,我重新考虑了。非常感谢。@HalilArslan不,不是这样,
x
的值将保持
3
。顺便说一句,如果您调用
Foo(3)
,会发生什么?如果保持3,意味着我们在函数中复制x?“我认为Foo(3)的结果是6,但我很困惑。”哈利拉尔斯兰如果你不相信,为什么不干脆呢?阅读你们的C语言课本也是一个很好的主意。我试过了,但我对你们给出的例子感到困惑,对不起。我只是在想@调用函数后,Michael WalzIt变为6岁。我明白了,我重新考虑了。非常感谢。@HalilArslan不,不是这样,
x
的值将保持
3
。顺便说一句,如果您调用
Foo(3)
,会发生什么?如果保持3,意味着我们在函数中复制x?“我认为Foo(3)的结果是6,但我很困惑。”哈利拉尔斯兰如果你不相信,为什么不干脆呢?阅读你们的C语言课本也是一个很好的主意。我试过了,但我对你们给出的例子感到困惑,对不起。我只是在想@迈克尔·沃尔兹