该程序扫描输入并使用C中链接列表的概念打印输入。程序扫描输入并在遇到“ - ”时停止。问题是它反向打印输入。我不想实现另一个可以扭转整个事情的功能。请帮助我不知道错误的位置。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student {
char name[64];
unsigned long long student_number;
struct student *next;
} student;
int main()
{
student *curr_stdptr;
student *hd_stdptr = NULL;
int i,x,y;
char input[70];
char in_name[60];
for(i=0;i<6;i++) {
curr_stdptr = (student *)malloc(sizeof(student));
curr_stdptr->next = hd_stdptr;
hd_stdptr = curr_stdptr;
fgets(input,60,stdin);
for(x=0;input[x]!='-';x++)
hd_stdptr->name[x] = input[x];
hd_stdptr->name[x] = '\0';
}
while(curr_stdptr!=NULL) {
printf("%s\n",curr_stdptr->name);
curr_stdptr=curr_stdptr->next;
}
}
答案 0 :(得分:1)
curr_stdptr = (student *)malloc(sizeof(student));
curr_stdptr->next = hd_stdptr;
hd_stdptr = curr_stdptr;
每当你读到一个新的student
时,你会在开头插入它,使它成为新头。所以最后student
成为头部。所以你总是得到相反的顺序。你可以插入新的最后每次students
。这样你就可以保持秩序。
//initialize hd_stdptr and curr_stdptr as NULL before loop
new_stdptr = (student *)malloc(sizeof(student));
new_stdptr->next=NULL;
if(hd_stdptr!=NULL)//not the first node
{
curr_stdptr->next = new_stdptr;
}
else
{ //first node
hd_stdptr = new_stdptr;
}
curr_stdptr = new_Stdptr;
编辑:在@WhozCraig评论后编辑。
正向链指针指针方法
用于在输入顺序中构造链表的另一种构建方法是使用带有指针指针的正向链接。最初,指向指针的指针保存head
指针的地址(最初是NULL
)。当项是输入时,它始终保存将接收下一个节点的指针的地址。完成后,它以最终的null结束,从而终止列表
完整示例包括修复代码中的几个潜在问题如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student
{
char name[70];
unsigned long long student_number;
struct student *next;
} student;
int main()
{
student *hd_stdptr = NULL, *p;
student **pp = &hd_stdptr;
int i,x;
char input[70];
for(i=0; i<6 && fgets(input,sizeof(input),stdin) != NULL; ++i)
{
student *p = malloc(sizeof *p);
if (p == NULL)
{
perror("Failed to allocate new student: ");
exit(EXIT_FAILURE);
}
for (x=0; input[x] && input[x] != '-' && input[x] != '\n'; ++x)
p->name[x] = input[x];
p->name[x] = 0;
/* save where new node belong */
*pp = p;
/* and advance our ptr-to-ptr to address location for next node */
pp = &p->next;
}
*pp = NULL;
for (p=hd_stdptr; p; p = p->next)
printf("%s\n",p->name);
/* free the list */
while (hd_stdptr)
{
p = hd_stdptr;
hd_stdptr = p->next;
free(p);
}
}
答案 1 :(得分:-1)
int main()
{
student *curr_stdptr;
student *hd_stdptr = NULL;
student *tail_stdptr = NULL;
int i,x,y;
char input[70];
char in_name[60];
for(i=0;i<6;i++) {
curr_stdptr = (student *)malloc(sizeof(student));
if( i == 0)
{
tail_stdptr = hd_stdptr = curr_stdptr;
}
else
{
tail_stdptr->next = curr_stdptr;
tail_stdptr = curr_stdptr;
}
fgets(input,60,stdin);
for(x=0;input[x]!='-';x++)
tail_stdptr->name[x] = input[x];
tail_stdptr->name[x] = '\0';
}
curr_stdptr = hd_stdptr;
while(curr_stdptr!=NULL) {
printf("%s\n",curr_stdptr->name);
curr_stdptr=curr_stdptr->next;
}
}
您可以尝试使用此代码,您可以添加指向tail_stdptr
尾部的另一个指针linked list
。
对于每个添加的元素,您可以根据tail_stdptr
将其附加到链接列表的尾部。