链表(C)为什么不起作用

链表(C)为什么不起作用,c,linked-list,C,Linked List,我试图构建一个程序,创建一个自动机状态(他的符号+下一个状态)&显示状态 这是我的代码: #include<stdio.h> #include<stdlib.h> typedef struct State { int state; char symb; int newState; struct State *next; }State; State *head,*neww,*p; void Add() { int i,j; printf("How m

我试图构建一个程序,创建一个自动机状态(他的符号+下一个状态)&显示状态

这是我的代码:

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



typedef struct State
{
int state;
char symb;
int newState;

struct State *next;
}State;

State *head,*neww,*p;


void Add()
{
  int i,j;

  printf("How many transitions in your automata\n");
  scanf("%d",&j);
  for(i=0;i<j;i++)
  {
  if(neww!=NULL)
  {
      neww = (struct State *)malloc(sizeof (struct State));
      printf("State number:");
      scanf("%d",&neww->state);
      printf("With which symbole to the next state:");
      scanf(" %c",&neww->symb);
      printf("To which state :");
      scanf("%d",&neww->newState);
      neww->next=NULL;

      if(head==NULL)
      {
          head=neww;
      }
      else{
        p = head;
        while(p->next !=NULL)
        {
            p=p->next;
        }
        p->next = neww;
      }
  }
  }
}

void Display()
{
    p=head;

    while(p != NULL)
    {
        printf("State : %d to state : %d with symbole : %c \n\n",p->state,p->newState,p->symb);
        p = p->next;
    }
    printf("END\n");
}

int main(void)
{
    head = NULL;

    Add();
    Display();
    return 0;
}
#包括
#包括
类型定义结构状态
{
int状态;
字符符号;
国际新闻国家;
结构状态*下一步;
}国家;
国家*元首,*新瓦州,*p;
void Add()
{
int i,j;
printf(“您的自动机中有多少个转换\n”);
scanf(“%d”和“&j”);
对于(i=0;istate);
printf(“与下一个状态的符号:”);
scanf(“%c”、&neww->symb);
printf(“到哪个状态:”);
scanf(“%d”,&neww->newState);
neww->next=NULL;
if(head==NULL)
{
水头=neww;
}
否则{
p=水头;
while(p->next!=NULL)
{
p=p->next;
}
p->next=neww;
}
}
}
}
无效显示()
{
p=水头;
while(p!=NULL)
{
printf(“状态:%d到状态:%d,符号:%c\n\n”,p->State,p->newState,p->symb);
p=p->next;
}
printf(“END\n”);
}
内部主(空)
{
head=NULL;
添加();
显示();
返回0;
}
你能帮我弄清楚为什么它在第一次打印后停止工作吗

EDIT1:现在它在将scanf(“%d”,j)更改为&j后,在第二次打印后停止

编辑2:在修正了所有扫描之后,它工作得很好

EDIT3:我在代码中添加了更正,现在我在显示中有一个循环,它不停地显示状态,我想这是一个链接问题

EDIT4:显示中的循环是由于未为其他状态分配空间所致;我将添加对代码的更正


感谢您的帮助

代码中几乎没有错误。您尚未读取转换、状态号和其他变量。只要在整个程序中纠正scanf的语法,其他一切都会正常工作。在
scanf
中的变量之前添加
&
,在Add()函数中更正此问题:

neww = malloc(sizeof (struct State)); // alloc
if(neww!=NULL){ // then test
说明:

  • 您首先必须尝试使用malloc()分配新状态:

    • 成功时,malloc()返回一个指向已分配内存的指针
    • 失败时返回NULL
  • 因此,如果(neww!=NULL){}来测试内存块是否已成功分配
  • 在那块砖上只写成功

Remarque:char在使用scanf()时可能会引起头痛

当您将struct中某个成员的地址传递给scanf时,请考虑用括号将该成员括起来,如下所示:

scanf("%d",&(neww->state));
守则:

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


typedef struct State State;
struct State
{
    int     state;
    char    symb; // <- char is problematic with scanf
    int     newState;
    State   *next;
};

State *head=NULL, // !MPORTANT: Initialized to NULL 
      *p;
/*_______________________________________________________________
*/
void Add(void){
    int i,j;
    State *neww;

    printf("\nHow many transitions in your automata? ");
    scanf("%d",&j);

    for(i=0;i<j;i++){
        //use calloc to initialize memory to 0
        neww = calloc(1,sizeof (struct State));
        if(neww!=NULL){ // only if calloc() succeded

            printf("State number: ");
            scanf("%d",&(neww->state)); // the addres of state not neww

            printf("With which symbole to the next state: ");
            scanf(" %c",&(neww->symb)); // idem @ of (symb)


            printf("To which state: ");
            scanf("%d",&(neww->newState)); // and idem @ of (newState)

            //neww->next=NULL; already been initialized by calloc

            if(head==NULL){
                head=neww;
            }else{
                p = head;
                while(p->next !=NULL){
                    p=p->next;
                }
                p->next = neww;
            }
        }else{
            perror("no enough memory");
            exit(1);
        }
    }
}
/*_______________________________________________________________
*/
void Display(void){

    p=head;
    printf("\n\nLIST\n");
    while(p != NULL)
    {
        printf("State : %d to state : %d with symbole : %c \n\n",p->state,p->newState,p->symb);
        p = p->next;
    }
    printf("END\n");
}
/*_______________________________________________________________
*/
int main(void){
    Add();
    Display();
    return 0;
}
#包括
#包括
类型定义结构状态;
结构状态
{
int状态;
char symb;//symb));//idem@of(symb)
printf(“到哪个状态:”);
scanf(“%d”,&(neww->newState));//和idem@of(newState)
//neww->next=NULL;已由calloc初始化
if(head==NULL){
水头=neww;
}否则{
p=水头;
while(p->next!=NULL){
p=p->next;
}
p->next=neww;
}
}否则{
perror(“内存不足”);
出口(1);
}
}
}
/*_______________________________________________________________
*/
作废显示(作废){
p=水头;
printf(“\n\n列表\n”);
while(p!=NULL)
{
printf(“状态:%d到状态:%d,符号:%c\n\n”,p->State,p->newState,p->symb);
p=p->next;
}
printf(“END\n”);
}
/*_______________________________________________________________
*/
内部主(空){
添加();
显示();
返回0;
}

scanf使用不正确,应为
scanf(“%d”和&j)
。这将调用UB。你的其他scanf电话也有同样的问题谢谢你的快速回复,我已经更正了!现在,在第二次打印后,它停止工作。FI仍然无法找到显示中存在循环的原因,添加fct中的链接似乎很好,显示中的while条件也很好,因此我不理解。感谢帮助。如果您不在显示中处理循环,那么您可以进入无限循环。我刚刚发现错误,我只是为第一个州创造空间;现在我把malloc移到了循环中,一切都很好!谢谢你,我没有意识到我在所有的扫描中都犯了同样的错误!它现在工作得很好:)请提供更多关于如何解决这个问题的解释。这是一个非常低质量的post,您首先必须尝试使用malloc()分配新状态,成功时malloc()返回指向已分配内存的指针,失败时返回NULL;因此,如果(neww!=NULL){来测试内存块是否已成功分配。并且仅在成功分配时才在该块上写入。感谢您的建议!这将对下一个代码非常有帮助。