【问题标题】:Inserting & Printing Linked List in C在 C 中插入和打印链表
【发布时间】:2021-04-07 23:37:23
【问题描述】:

我正在使用这段代码的 sn-p 测试我的链表函数,但我无法正确打印它。我希望程序打印出HELLO,但它打印出LO。这是我第一次使用链表,因此感谢您的帮助。

我确实尝试在每次插入字母后放置 print 函数,以查看 insert 函数是否正常工作,它们是否正常工作。它会打印出每个字母,但在插入所有字母并再次打印后,它只会打印出最后两个字母。所以我认为问题不在于insert 函数,但我可能是错的。

这是我的头文件:


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

typedef char DATA_TYPE;


typedef struct node_t
{
    DATA_TYPE item;
    struct node_t* next;
} node;

typedef struct
{
    node* head;
    int len;
} linkedlist_t;

void init_list(linkedlist_t* plist);
void insert_first(linkedlist_t* plist, DATA_TYPE item);
void insert_middle(linkedlist_t* plist, int pos, DATA_TYPE item);
void insert_last(linkedlist_t* plist, DATA_TYPE item);
void print(linkedlist_t* plist);    

功能:

#include "linkedlist.h"

void init_list(linkedlist_t* plist)
{

    plist->head = (node *)malloc(sizeof(node));
    plist->head->next = NULL;
    plist->len = 0;
}


void insert_first(linkedlist_t* plist, DATA_TYPE item)
{
    node* cur, *newNode;

    newNode = (node *)malloc(sizeof(node));
    newNode->item = item;
    newNode->next = NULL;

    cur = plist->head;

    newNode->next = cur->next;
    cur->next = newNode;
    plist->len++;
}



void insert_middle(linkedlist_t* plist, int pos, DATA_TYPE item)
{

    node* cur, *newNode;
    if(pos < 0 || pos > plist->len){
        exit(1);
    }

    newNode = (node *)malloc(sizeof(node));
    newNode->item = item;
    newNode->next = NULL;

    cur = plist->head;
    for(int i = 0; i < pos; i++){
        cur = cur->next;
    }

    newNode->next = cur->next;
    cur->next = newNode;
    plist->len++;
}

void insert_last(linkedlist_t* plist, DATA_TYPE item)
{

    node* cur, *newNode;

    newNode = (node *)malloc(sizeof(node));
    newNode->item = item;
    newNode->next = NULL;

    cur = plist->head;
    while(cur->next != NULL){
        cur = cur->next;
    }

    newNode->next = cur->next;
    cur->next = newNode;
    plist->len++;

}


void print(linkedlist_t* plist)
{
    node* cur;
    while(cur != NULL){
        printf("%c", cur->item);
        cur = cur->next;
    }
    printf("\n");
}

主要功能:

#include "linkedlist.h"
#include <string.h>

int main(void) {


    linkedlist_t list;

    init_list(&list);

    insert_first(&list, 'H');
    insert_middle(&list, 1, 'E');
    insert_middle(&list, 2, 'L');
    insert_middle(&list, 3, 'L');
    insert_last(&list, 'O');

    print(&list);

    return 0;
}

【问题讨论】:

  • 无法正确打印。你能给出确切的行为吗? 我想我知道问题出在哪里。您能给我们提供这些信息吗?
  • @kaylum 我更新了问题,希望现在更完整一些。

标签: c linked-list


【解决方案1】:

您的print 函数不使用参数plist

你很可能想要这样的东西:

void print(linkedlist_t* plist)
{
    node* cur = plist->head;
    while(cur != NULL){
        printf("%c", cur->item);
        cur = cur->next;
    }
    printf("\n");
}

另外init_list 正在将一个带有未初始化字符的节点添加到列表的开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多