如何修改链表中的用户输入?

Posted

技术标签:

【中文标题】如何修改链表中的用户输入?【英文标题】:How to modify user input in linked list? 【发布时间】:2018-05-10 04:57:38 【问题描述】:

我目前正在课堂上学习如何使用链表。我只能添加、删除、显示和排序数据。

是否可以编辑用户输入的数据?

请看一下代码,这是一种可能的修改方式吗?

修改列表值我实现了一个简单的提示机制,但是有个小问题:

用户输入年龄后程序立即停止工作。

void node::update()

    int updateAge;
    cout << "Please enter age: ";
    cin>>updateAge;
    int ch;
    int a;
    node *current;
    node *temp;
    node *start_ptr;

    if (start_ptr == NULL)
        cout << "No record to update!" << endl;
    else
    
        current = start_ptr;

        while((current!=NULL) && (current->temp->age!=updateAge))
        
            current=current->next;
        
        if (current==NULL)
            cout<<"The Requested age is Not Found" << endl;


        else if(current->temp->age==updateAge)
        
            cout<<"What Information You Want To Update?" << endl;
            cout<<"1. Name" << endl;
            cout<<"2. Height" << endl;
            cin>>ch;
            system("cls");

            switch(ch)
            
                case 1 :
                
                    cout << "Enter New Name: ";
                    cin.ignore();
                    getline(cin, current->temp->name);
                    break;
                

                case 2 :
                
                    cout<<"Enter New Height: ";
                    cin >> current->temp->height;
                    break;
                

                default:
                
                    cout<<"Wrong Input! Please choose again: ";
                    cin>>ch;
                
            
            cout<<"RECORD UPDATED !";
        
    


struct list

    list *head, *tail;
    list *next;
;

class node

    private:
        std::string name; // Name
        int age; // Age in integer
        float height; // In meters

    public:
        node *next; // Pointer to next node
        node *head, *tail;
        node *start_ptr = NULL; // Start Pointer (root)
        node *temp;
        node *temp2;
        node *pNextValue;
        node* prev; // empty header
        node* current;
        void update();
        void printList();
        void delete_end_node();
        void search();
        void sort_age();
        void deletebyAge();
    node()
        
            head = NULL;
            tail = NULL;
        


        void getInput()
        
            temp = new node;
            cout << "Name: ";
            cin >> temp->name;
            cout << "Age: ";
            cin >> temp->age;
            cout << "Height: ";
            cin >> temp->height;

            cout<<"\n";
            temp->next = NULL; // Sets the node to be the last node
            if (start_ptr == NULL)
                start_ptr = temp;
            else
            
                temp2 = start_ptr; // We know temp2 is not NULL - list not empty!
                while (temp2->next != NULL) // The loop will terminate when temp2
                    temp2 = temp2->next;        // points to the last node in the list
                                                    // Move to next link in chain
                temp2->next = temp; // Sets the pointer from that last node to point
                                    // to the node that has just declared
            
         // End of getInput() function
; //End of class

【问题讨论】:

是的,你想要的都是可能的。由于这看起来像家庭作业,但我将把它留给你。您提供的代码 sn-p 是否可以完成这项工作也只有您可以决定。 @UlrichEckhardt 不,这不是作业。我只是使用此代码来了解有关如何在课堂上使用链表的更多信息。 :) 只是想指出输入处理不是很健壮。如果用户输入的值不是 12 怎么办?我建议你实现一个用户交互功能,这将帮助你确保用户输入是有效的。祝你好运,欢迎来到 ***! 哦,我忘了@RannLifshitz 您能否发布您在应用程序崩溃时收到的错误信息?您还可以提供用于执行的输入吗? 【参考方案1】:

在您的成员函数update 中,您正在重新声明一个名为start_ptr 的新节点,它没有指向您列表中的任何内容。你应该只使用Node *current = start_ptr; 在你的节点类中创建currenttemp 变量是没有意义的。

这就是 Node 和 List 所需要的一切:

class Node 
public:
    Node() : data(0), prev(nullptr), next(nullptr) 
    Node(int newData, Node *newPrev, Node *newNext)
    : data(newData), prev(newPrev), next(newNext) 

    int getData() const  return data; 
    Node *getPrev() const  return prev; 
    Node *getNext() const  return next; 
    void setData(const int& newData)  data = newData; 
    void setPrev(Node *newPrev)  prev = newPrev; 
    void setNext(Node *newNext)  next = newNext; 
    ~Node() 
private:
    int data;
    Node *prev;
    Node *next;
;

class DoublyList 
public:
    DoublyList(); 

    ~DoublyList();

    void destroyList();

private:
    Node *first;    // pointer to the first node on the list
    Node *last;     // pointer to the last node on the list
    int count;      // number of nodes in the list
;

还有这些行:

    current = start_ptr;

    while((current!=NULL) && (current->temp->age!=updateAge))
    
        current=current->next;
    
    if (current==NULL)
        cout<<"The Requested age is Not Found" << endl;

您在 while 循环中将 current 设置为 next,因此最终 current 将变为 nullptr,因此 if 语句将被评估为 true,这将输出“未找到请求的年龄” .

还有一点:不要使用NULL,而是使用nullptr

【讨论】:

我已经发布了节点类和列表结构。 @Aurora 你可以参考我的代码来构建你的链表。但我认为你的程序不起作用的原因是因为你在更新函数中重新声明了你的start_ptr 您对node *current = start_ptr; 的看法是正确的,我发现我只需要删除update() 函数中的所有temp

以上是关于如何修改链表中的用户输入?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据动态存储在C中的链表中?

C中链表中的错误

从链表中删除用户选择的节点,用 c 中另一个列表中的节点替换它们

jtable仅使用链表中的值填充一行

如何使用 PHP、SQL 和 Microsoft Access 将另一个表中的 select max 函数和用户输入的变量插入表中?

删除未排序链表中的所有重复节点