【问题标题】:C Linked List Add Item at the EndC 链表在末尾添加项目
【发布时间】:2018-09-21 11:27:45
【问题描述】:

我正在编写一个在现有链表末尾添加节点的程序。 问题是它似乎没有将硬编码值7 分配给链表最后一个元素的struct node 的变量nr。 代码如下:

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

struct node {
    int nr;
    struct node *next;
};

void addNodes(struct node **head, int n);
void displayList(struct node *head);
void addItemLast(struct node *head);

int main() {
    struct node* head = NULL;
    int n;

    printf("Introduceti numarul de noduri: ");
    scanf("%d", &n);

    addNodes(&head, n);
    displayList(head);
    addItemLast(head);
    displayList(head);

    return 0;
}

void addNodes(struct node **head, int n) {
    *head = (struct node*)malloc(sizeof(struct node));
    struct node *current = *head;

    printf("\nIntroduceti %d noduri:\n", n);
    for(int i = 0; i < n; i++) {
        printf("Element %d = ", i+1);
        scanf("%d", &(current -> nr));

        current->next = (struct node*)malloc(sizeof(struct node));
        current = current->next;
    }
    current->next = NULL;
}

void displayList(struct node *head) {
    struct node *current = head;
    int i = 1;

    printf("\nElementele introduse sunt:\n");
    while(current->next != NULL) {
        printf("Elementul %d = %d\n", i, current->nr);

        current = current->next;
        i++;
    }
}

void addItemLast(struct node *head) {
    struct node *temp = head, *last;
    last = (struct node*)malloc(sizeof(struct node));

    if(last == NULL) {
        printf("\nMemory cannot be allocated!\n");
    } else {
        last->nr = 7;
        last->next = NULL;

        while(1) {
            if(temp->next == NULL) {
                temp->next = last;
                break;
            }
            temp = temp->next;
        }
    }
}

最后一个函数 addItemLast() 没有按预期工作。

这是输出:

Introduceti numarul de noduri: 3

Introduceti 3 noduri:
Element 1 = 1
Element 2 = 2
Element 3 = 3

Elementele introduse sunt:
Elementul 1 = 1
Elementul 2 = 2
Elementul 3 = 3

有问题的函数运行后,我得到这个输出:

Elementele introduse sunt:
Elementul 1 = 1
Elementul 2 = 2
Elementul 3 = 3
Elementul 4 = 13383248

元素 4 不包含硬编码值 7,而是有一个垃圾值,我不知道为什么。

【问题讨论】:

  • 这是因为你没有显示最后一个节点while(current-&gt;next != NULL)应该是while(current != NULL)

标签: c singly-linked-list


【解决方案1】:

您对addNodes 的实现不正确,假设我输入n = 2,创建了3 个节点但只调用了两次scanf 函数,因此您在某些节点中有垃圾值(nr 未设置)。

重新实现它(如果addItemLast函数被正确实现,它就可以工作):

void addNodes(struct node **head, int n){
    printf("\nIntroduceti %d noduri:\n", n);
    for(int i = 0; i < n; i++){
        struct node* last = addItemLast(*head);
        if (*head == NULL)
            *head = last;

        printf("Element %d = ", i);
        scanf("%d", &(last -> nr));
    }
}

当您想调用此函数但headNULL 时,您需要更改addItemLast 来处理大小写(如果不测试这种情况,您的程序会在调用addItemLast 以获取空列表时崩溃):

struct node* addItemLast(struct node *head){
    struct node *temp = head, *last;

    last = (struct node*)malloc(sizeof(struct node));
    if (head == NULL)  // <---------
    {
        last->nr = 7;
        last->next = NULL;
        return last;
    }

    if(last == NULL){
        printf("\nMemory cannot be allocated!\n");
    }else{
        last->nr = 7;
        last->next = NULL;

        while(1){
            if(temp->next == NULL){
                temp->next = last;
                break;
            }
            temp = temp->next;
        }
    }
    return last;
}

最后显示列表的函数应该是:

   void displayList(struct node *head){
        struct node *current = head;
        int i = 1;

        printf("\nElementele introduse sunt:\n");
        while(current != NULL){  // <---------
            printf("Elementul %d = %d\n", i, current->nr);

            current = current->next;
            i++;
        }
    }

【讨论】:

    【解决方案2】:

    访问current的元素时不必检查是否current-&gt;next != NULL

    将你的while循环更改为:

    while(current != NULL){
            printf("Elementul %d = %d\n", i, current->nr);
    
            current = current->next;
            i++;
        }
    

    【讨论】:

      猜你喜欢
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      相关资源
      最近更新 更多