C ++链表 [英] C++ Linked list

查看:44
本文介绍了C ++链表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使链接列表也与此处相似:

I'm trying to make linked list similar too the one here:

C语言中的链接列表

那是在另一个结构中首先拥有"head",我首先称它为"head".但是我发现进行了更改.难以向 list_item 结构添加值.我已经尝试了一些方法来查看它是否有效.它可以编译,但是当我运行代码时它将崩溃.任何帮助将对您有所帮助.我知道崩溃的原因是当我想将new_node指向链表时.

That is to have the "head", I called it first, inside another struct. However I found doing that change. Makes it hard to add values to the list_item struct. I have tried some few things to see if it works. It compiles, however when I run the code it will crash. Any help would be helpful here. I know the cause of the crash is when I want to point the new_node to the linked_list.

#include <iostream>

using namespace std;

struct list_item
{
    int key;
    int value;
    list_item *next;
};

struct list
{
    struct list_item *first;
};

int main()
{
    list *head;
    list *new_node;

    head = NULL;
    head->first = NULL;

    for(int i = 0; i < 10; i++)
    {
        //allocate memory for new_node
        new_node = (list*)malloc(sizeof(list));
        new_node->first = (list_item*)malloc(sizeof(list_item));
        //adding the values
        new_node->first->key = i;
        new_node->first->value = 10 + i;

        //point new_node to first;
        new_node->first->next = head->first;

        //point first to new_node;
        head->first = new_node->first;

    }

    //print
     list *travel;
     travel->first = head->first;

     int i = 0;
     while(travel != NULL)
     {
         cout << travel->first->value << endl;
         travel->first = travel->first->next;
     }

    return 0;
}

推荐答案

您正在创建 10 个列表,我想您可以尝试执行以下操作:

You are creating 10 lists, I think you might try to do something like this:

#include <iostream>

using namespace std;

struct list_item
{
    int key;
    int value;
    list_item *next;
};

struct list
{
    struct list_item *first;
};

int main()
{
    //Just one head is needed, you can also create this
    // on the stack just write:
    //list head;
    //head.first = NULL;
    list *head = (list*)malloc(sizeof(list));
    list_item *new_node = NULL;

    head->first = NULL;

    for(int i = 0; i < 10; i++)
    {
        //allocate memory for new_node
        new_node = (list_item*)malloc(sizeof(list_item));
        //adding the values
        new_node->key = i;
        new_node->value = 10 + i;

        //if the list is empty, the element you are inserting
        //doesn't have a next element

        new_node->next = head->first;

        //point first to new_node. This will result in a LIFO
        //(Last in First out) behaviour. You can see that when you 
        //compile
        head->first = new_node;

    }

     //print the list 
     list_item *travel;
     travel = head->first;

     while(travel != NULL)
     {
         cout << travel->value << endl;
         travel = travel->next;
     }

    //here it doesn't matter, but in general you should also make
    //sure to free the elements
    return 0;
}

这是怎么回事.一开始,您只有一个头,没有任何元素.

This is what is going on. At first you only have one head and no elements.

head
  |
  |
  V
 NULL

然后添加您的第一个元素.确保"new_node-> next == NULL":

Then you add your first element. Make sure that the "new_node->next==NULL":

head
  |
  |
  V
node:   ------------------> NULL
key = 0
value = 10

然后在前面添加另一个节点,但将第一个节点附加到其下一个节点.您将指针从头部移到新节点

Then you add another node in front but append your first node to its next node. you move the pointer from the head to the new node

head:
first
  |
  |
  V
node:   ---------> node:  -------------> NULL
key: 1             key: 0   
value: 11          value: 10  

由于您使用的是c ++,因此您可以考虑使用"new"和"delete".只需替换

Since you are using c++, you might consider using "new" and "delete". Just replace

new_node = (list_item*)malloc(sizeof(list_item));

使用

list *head = new list

这篇关于C ++链表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆