Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印链接列表时出错_C_Linked List - Fatal编程技术网

C 打印链接列表时出错

C 打印链接列表时出错,c,linked-list,C,Linked List,我创建了链表来存储员工id和姓名 当我试图打印它时,它只显示id而不是员工姓名,当用户输入-1并且不询问姓名时,我还想退出该程序。它应该简单地退出该程序并显示我当前正在使用devC++编译代码的id和姓名 #include<stdio.h> #include<conio.h> #include<stdlib.h> struct node { int id; char name[20]; struct node *next; }; st

我创建了链表来存储员工id和姓名

当我试图打印它时,它只显示id而不是员工姓名,当用户输入-1并且不询问姓名时,我还想退出该程序。它应该简单地退出该程序并显示我当前正在使用devC++编译代码的id和姓名

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct node
{
    int id;
    char name[20];
    struct node *next;
};

struct node *create()
{
    struct node *p, *r, *n;
    int s, k;
    char name[20];
    s = sizeof(struct node);
    printf("Linked List\n");
    printf("Enter id:");
    scanf("%d", &k);
    printf("Enter name:");
    scanf("%s", name);
    p = r = NULL;
    while(k!=-1)
    {
        n = (struct node *)malloc(s);
        n->id = k;
        n->next = NULL;
        if(r == NULL)
            r = n;
        else
            p->next=n;
        p=n;
        printf("Enter the Id or-1 to stop:");
        scanf("%d", &k);
        printf("Enter the name ");
        scanf("%s", name);
    }
    return(r);      
}

void display(struct node *r)
{
     printf("\nId             Name \n");
     while(r != NULL)
     {
         printf("\n %d", r->id);
         printf("\n %s", r->name);
         r = r->next;    
     }
}

int main()
{
    struct node *ptr;
    ptr = create();
    display(ptr);
}
#包括
#包括
#包括
结构节点
{
int-id;
字符名[20];
结构节点*下一步;
};
结构节点*create()
{
结构节点*p,*r,*n;
int s,k;
字符名[20];
s=sizeof(结构节点);
printf(“链表”);
printf(“输入id:”);
scanf(“%d”和“&k”);
printf(“输入名称:”);
scanf(“%s”,名称);
p=r=NULL;
而(k!=-1)
{
n=(结构节点*)malloc(s);
n->id=k;
n->next=NULL;
if(r==NULL)
r=n;
其他的
p->next=n;
p=n;
printf(“输入Id或-1以停止:”);
scanf(“%d”和“&k”);
printf(“输入名称”);
scanf(“%s”,名称);
}
回报率(r);
}
无效显示(结构节点*r)
{
printf(“\nId Name\n”);
while(r!=NULL)
{
printf(“\n%d”,r->id);
printf(“\n%s”,r->name);
r=r->next;
}
}
int main()
{
结构节点*ptr;
ptr=create();
显示器(ptr);
}

您实际上读取了
name
变量,但没有在结构中移动它。 也就是说,您可以直接读入分配的结构,但棘手的部分是当用户输入太大(超过19个字符)时,要注意不要使缓冲区溢出

这可能是这样的:

#include<stdio.h>
#include<stdlib.h>
struct node {
    int id;
    char name[20];
    struct node *next;
};

struct node *create(void) {
    struct node *p, *r;
    printf("Linked List\n");
    p = r = NULL;
    while (1) {
        int id;
        printf("Enter the Id or-1 to stop:");
        scanf("%d", &id);

        if (id == -1)
            break; // user asked to leave

        struct node *n = malloc(sizeof(*n));
        // if (n == NULL) exit(-1); as you prefere...
        n->id = id;
        printf("Enter the name ");
        // careful of buffer overflow here
        scanf("%19s%*[^\n]", n->name);
        n->next = NULL;

        if (r == NULL)
            r = n;
        else
            p->next = n;
        p = n;
    }
    return r;
}

void delete(struct node *r) {
    while (r != NULL) {
        struct node *n = r;
        r = r->next;
        free(n);
    }
}

void display(const struct node *r) {
    printf("\nId             Name \n");
    while (r != NULL) {
        printf("%d         %s\n", r->id, r->name);
        r = r->next;
    }
}

int main(int argc, char **argv) {
    struct node *ptr = create();
    display(ptr);
    delete(ptr);
    return 0;
}
#包括
#包括
结构节点{
int-id;
字符名[20];
结构节点*下一步;
};
结构节点*创建(空){
结构节点*p,*r;
printf(“链表”);
p=r=NULL;
而(1){
int-id;
printf(“输入Id或-1以停止:”);
scanf(“%d”和&id);
如果(id==-1)
break;//请求用户离开
结构节点*n=malloc(sizeof(*n));
//如果(n==NULL)退出(-1);如您所愿。。。
n->id=id;
printf(“输入名称”);
//注意这里的缓冲区溢出
scanf(“%19s%*[^\n]”,n->name);
n->next=NULL;
if(r==NULL)
r=n;
其他的
p->next=n;
p=n;
}
返回r;
}
void delete(结构节点*r){
while(r!=NULL){
结构节点*n=r;
r=r->next;
自由(n);
}
}
无效显示(常量结构节点*r){
printf(“\nId Name\n”);
while(r!=NULL){
printf(“%d%s\n”,r->id,r->name);
r=r->next;
}
}
int main(int argc,字符**argv){
结构节点*ptr=create();
显示器(ptr);
删除(ptr);
返回0;
}

作为奖励,我还添加了免费部分,这样您就不会泄漏。

您实际上读取了
name
变量,但您不会在结构中移动它。 也就是说,您可以直接读入分配的结构,但棘手的部分是当用户输入太大(超过19个字符)时,要注意不要使缓冲区溢出

这可能是这样的:

#include<stdio.h>
#include<stdlib.h>
struct node {
    int id;
    char name[20];
    struct node *next;
};

struct node *create(void) {
    struct node *p, *r;
    printf("Linked List\n");
    p = r = NULL;
    while (1) {
        int id;
        printf("Enter the Id or-1 to stop:");
        scanf("%d", &id);

        if (id == -1)
            break; // user asked to leave

        struct node *n = malloc(sizeof(*n));
        // if (n == NULL) exit(-1); as you prefere...
        n->id = id;
        printf("Enter the name ");
        // careful of buffer overflow here
        scanf("%19s%*[^\n]", n->name);
        n->next = NULL;

        if (r == NULL)
            r = n;
        else
            p->next = n;
        p = n;
    }
    return r;
}

void delete(struct node *r) {
    while (r != NULL) {
        struct node *n = r;
        r = r->next;
        free(n);
    }
}

void display(const struct node *r) {
    printf("\nId             Name \n");
    while (r != NULL) {
        printf("%d         %s\n", r->id, r->name);
        r = r->next;
    }
}

int main(int argc, char **argv) {
    struct node *ptr = create();
    display(ptr);
    delete(ptr);
    return 0;
}
#包括
#包括
结构节点{
int-id;
字符名[20];
结构节点*下一步;
};
结构节点*创建(空){
结构节点*p,*r;
printf(“链表”);
p=r=NULL;
而(1){
int-id;
printf(“输入Id或-1以停止:”);
scanf(“%d”和&id);
如果(id==-1)
break;//请求用户离开
结构节点*n=malloc(sizeof(*n));
//如果(n==NULL)退出(-1);如您所愿。。。
n->id=id;
printf(“输入名称”);
//注意这里的缓冲区溢出
scanf(“%19s%*[^\n]”,n->name);
n->next=NULL;
if(r==NULL)
r=n;
其他的
p->next=n;
p=n;
}
返回r;
}
void delete(结构节点*r){
while(r!=NULL){
结构节点*n=r;
r=r->next;
自由(n);
}
}
无效显示(常量结构节点*r){
printf(“\nId Name\n”);
while(r!=NULL){
printf(“%d%s\n”,r->id,r->name);
r=r->next;
}
}
int main(int argc,字符**argv){
结构节点*ptr=create();
显示器(ptr);
删除(ptr);
返回0;
}

作为奖励,我还添加了免费部分,这样您就不会泄漏。

您不会存储读入名称…旁白:您的程序流很奇怪,因为它会让用户在输入退出代码后输入一个名称,-1.请修复代码的缩进。我试图保存name n->name=name,但它显示出错误,您需要使用或类似于复制字符串的内容。您没有存储读入名称…旁白:您的程序流很奇怪,因为它让用户在输入退出代码后输入名称,-1.请修复代码的缩进。我试图保存name n->name=name,但它显示错误,您需要使用或类似的方法来复制字符串。