通过在末端插入机制来创建链接列表

时间:2018-09-14 16:35:15

标签: c++ data-structures linked-list

我是c ++的新手,我正在尝试使用c ++实现数据结构->链表,程序未显示任何错误,但不适用于多个元素,并且display_List()函数也不起作用事件,尽管它在主函数中被调用。

#include <iostream>
#include <conio.h>
using namespace std;
struct Node
{
    int data_;
    struct Node * link_;
};
struct Node * start = NULL;
void create_Node(int data)
{
    struct Node * temp,*pos;
    temp = new Node;
    temp->data_=data;
    temp->link_=NULL;
    if(start==NULL)
        start = temp;
    else
    {
        pos = start;
        while(pos->link_ != NULL)
        {
            pos=pos->link_;
        }
        pos->link_ = temp;
    }
}
void display_List()
{
    struct Node * Print;
    Print = start;
    while(Print->link_ != NULL || Print->link_==NULL)
    {
        cout << Print->data_;
        if(Print->link_!=NULL)
            cout<<"-->";
        Print = Print->link_;
    }
}
int main()
{
    int Data , no_of_Element;
    cout << "Enter the no_of_Element: "<<endl;
    cin >> no_of_Element;
    while (no_of_Element > 0)
    {
        cout << "Enter the Data to be inserted: "<<endl;
        cin >> Data;
        create_Node(Data);
        no_of_Element--;
    }
    display_List();
    return 0;
}

3 个答案:

答案 0 :(得分:1)

$query = $database->query("SELECT EXISTS(SELECT * FROM contacts WHERE contact_id = '$contactID')";

if($query == 0){
echo "not registered";
}elseif($query == 1){
echo "registered"
}

应该是

void display_List()
{
    struct Node * Print;
    Print = start;
    while(Print->link_ != NULL)
    {
        cout << Print->data_ <<"-->";
    }
}

您的循环停止得太早了,因为您正在测试void display_List() { struct Node * Print; Print = start; while(Print != NULL) { cout << Print->data_ <<"-->"; Print = Print->link_; } } 而不是Print->link_ != NULL。另外,因为您没有Print != NULL,所以您永远不会移至列表中的下一项。

Print = Print->link_;

应该是

if(start==NULL)
    start = temp;
else
    struct Node * pos;
    pos = start;
    while(pos->link_ != NULL)
    {
        pos=pos->link_;
    }
    pos->link_ = temp;

您忘记在if语句的else部分周围添加if(start==NULL) start = temp; else { struct Node * pos; pos = start; while(pos->link_ != NULL) { pos=pos->link_; } pos->link_ = temp; }

找到这些错误的简便方法(比发布到SO更容易)是使用调试器一次一行地遍历代码。调试器很快就会发现以上所有三个错误,您应该学习如何使用它。

答案 1 :(得分:1)

您的代码中有两个问题。

  1. 插入时if语句缺少括号。

    进行如下更改。

    if(start==NULL)
    {
        start = temp;
    }
    else
    {
        struct Node * pos;
        pos = start;
        while(pos->link_ != NULL)
        {
            pos=pos->link_;
        }
        pos->link_ = temp;
    }
    
  2. 您的显示功能将导致无限循环,因为您没有递增Print指针。

    将其更改为以下内容。

    while(Print != NULL)
    {
        cout << Print->data_ <<"-->";
        Print = Print->link_;
    }
    

答案 2 :(得分:1)

您的代码存在很多问题。

首先,在C ++中,您不需要像在C中那样,在结构类型的变量的类型名称前加上struct关键字。

create_Node()中,您的else缺少必需的大括号。

display_List()中,如果列表为空,则您的代码具有未定义的行为,因为Print在取消引用时将为NULL。另一方面,如果列表具有多个节点,则代码将陷入无限循环,因为您没有在每次迭代中更新Print来指向下一个节点。

main()中,您正在泄漏分配给列表的内存,然后退出。

尝试以下方法:

#include <iostream>
using namespace std;

struct Node
{
    int data_;
    Node * link_;
};

Node *start = NULL;

void create_Node(int data)
{
    Node *temp;
    temp = new Node;
    temp->data_ = data;
    temp->link_ = NULL;
    if (start == NULL)
        start = temp;
    else
    { // <-- add this !
        Node *pos;
        pos = start;
        while (pos->link_ != NULL)
        {
            pos = pos->link_;
        }
        pos->link_ = temp;
    } // <-- add this!
}

void display_List()
{
    Node *Print;
    Print = start;
    while (Print != NULL) // <-- change to this!
    {
        cout << Print->data_ << "-->";
        Print = Print->link_; // <-- add this!
    }
}

void destroy_List() // <-- add this!
{
    Node *temp;
    temp = start;
    while (temp != NULL)
    {
        Node *next = temp->link_;
        delete temp;
        temp = next;
    }
}

int main()
{
    int Data, no_of_Element;

    cout << "Enter the no_of_Element: " << endl;
    cin >> no_of_Element;

    while (no_of_Element > 0)
    {
        cout << "Enter the Data to be inserted: " << endl;
        cin >> Data;
        create_Node(Data);
        no_of_Element--;
    }

    display_List();
    destroy_List(); // <-- add this!

    return 0;
}

话虽如此,其中一些代码可以进一步简化:

#include <iostream>
using namespace std;

struct Node
{
    int data_;
    Node *link_;

    Node(int data) : data_(data), link_(NULL) {}
};

Node *start = NULL;

void create_Node(int data)
{
    Node **cur = &start;
    while (*cur)
        cur = &((*cur)->link_);
    *cur = new Node(data);
}

void display_List()
{
    for(Node *cur = start; cur != NULL; cur = cur->link_)
        cout << cur->data_ << "-->";
}

void destroy_List()
{
    Node *next;
    for(Node *temp = start; temp != NULL; temp = next)
    {
        next = temp->link_;
        delete temp;
    }
}

int main()
{
    int Data, no_of_Element;

    cout << "Enter the no_of_Element: "<< endl;
    cin >> no_of_Element;

    for (int i = 0; i < no_of_Element; --i)
    {
        cout << "Enter the Data to be inserted: " << endl;
        cin >> Data;
        create_Node(Data);
    }

    display_List();
    destroy_List();

    return 0;
}

话虽如此,一旦您了解了这一点,您就应该真正改用std::list,甚至在C ++ 11及更高版本中使用std::forward_list

#include <iostream>
#include <list> // or <forward_list>

list<int> my_list; // or forward_list<int>

int main()
{
    int Data, no_of_Element;

    cout << "Enter the no_of_Element: "<< endl;
    cin >> no_of_Element;

    for (int i = 0; i < no_of_Element; --i)
    {
        cout << "Enter the Data to be inserted: " << endl;
        cin >> Data;
        my_list.push_back(Data);
    }

    for(list<int>::iterator iter = my_list.begin(); // or forward_list<int>
        iter != my_list.end();
        ++iter)
    {
        cout << iter->data_ << "-->";
    }

    /* or, in C++11 and later:
    for(auto data : my_list)
        cout << data << "-->";
    */

    return 0;
}