如何修改链表中的用户输入?
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 不,这不是作业。我只是使用此代码来了解有关如何在课堂上使用链表的更多信息。 :) 只是想指出输入处理不是很健壮。如果用户输入的值不是1
或 2
怎么办?我建议你实现一个用户交互功能,这将帮助你确保用户输入是有效的。祝你好运,欢迎来到 ***!
哦,我忘了@RannLifshitz
您能否发布您在应用程序崩溃时收到的错误信息?您还可以提供用于执行的输入吗?
【参考方案1】:
在您的成员函数update
中,您正在重新声明一个名为start_ptr
的新节点,它没有指向您列表中的任何内容。你应该只使用Node *current = start_ptr;
在你的节点类中创建current
或temp
变量是没有意义的。
这就是 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 中另一个列表中的节点替换它们
如何使用 PHP、SQL 和 Microsoft Access 将另一个表中的 select max 函数和用户输入的变量插入表中?