C 打印链接列表时出错
我创建了链表来存储员工id和姓名 当我试图打印它时,它只显示id而不是员工姓名,当用户输入-1并且不询问姓名时,我还想退出该程序。它应该简单地退出该程序并显示我当前正在使用devC++编译代码的id和姓名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
#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,但它显示错误,您需要使用或类似的方法来复制字符串。