创建排队的对象列表

时间:2018-06-16 14:54:16

标签: c pointers object linked-list

任务是在main中创建对象并将其传递给其他函数,这将创建队列类型的列表。这就是我正在使用的算法:

  • 编写Node *类型的函数,return指向列表的最后Node的指针

  • 要在列表的末尾插入Node,需要获取指向上一个Node

    的指针
  • 制作新的Node
  • 将新传递的Node对象分配给函数
  • 从最后next点开始Node新的

以下是代码:

typedef struct Node{
int val;
char str[30];
struct Node *next;
}Node;

void printList(const Node * head);
void queue(Node *head, Node *object);
Node *getLast(Node *head);

int main(void){

Node *head = NULL;
Node *object = (Node *)malloc(sizeof(Node));
int c = 0;
while(1){
    printf("This int will be stored in Node %d.\n", ++c);
    scanf("%d", &object->val);
    if(!object->val){
        puts("You've decided to stop adding Nodes.");
        break;
    }
    fflush(stdin);
    printf("This string will be stored in Node %d.\n", c);
    fgets(object->str, 30, stdin);
    if(!(strcmp(object->str, "\n\0"))){
        puts("You've decided to stop adding Nodes.");
        break;
    }


queue(head, object);


}
printList(head);

return 0;
}

void printList(const Node *head){
if(head == NULL){
    puts("No list exists.");
    exit(1);
}
while(1){

    printf("|||Int: %d|||String: %s|||\n", head->val, head->str);

    if(head->next){
        head = head->next;
    }
    else{
        break;
    }
}
}

Node *getLast(Node *head){
if(head == NULL){
    return NULL;
}
while(head->next){
    head = head ->next;
}
return head;
}

void queue(Node *head, Node *object){
Node *last = getLast(head);
Node *tmp = (Node *)malloc(sizeof(Node));
*tmp = *object;
tmp -> next = NULL;
last -> next = tmp;
}

问题可能在于getLast return NULL。但是,当我创建仅包含int列表时,同样的事情也是如此。

1 个答案:

答案 0 :(得分:2)

正如评论部分所指出的,last->next = tmp无法首次调用queue(),因为getLast()返回NULL。一个正确的解决方案是这样的:

  void queue(Node **head, Node *object){                                          
  Node *last = getLast(*head);                                                  
  Node *tmp = (Node *)malloc(sizeof(Node));                                     
  *tmp = *object;                                                               
  tmp -> next = NULL;                                                           

  if (last != NULL)                                                             
    last -> next = tmp;                                                         
  else                                                                          
    *head = tmp;                                                                
}

并从main()调用queue(&head, object)