- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的英语不是很好,但希望你们能理解我想说的。所以这是链表的代码,运行程序并添加信息后,它可以在 printListStart() 打印。现在我在 printListEnd() 编写代码时遇到了麻烦,我想从最后显示代码(反向)。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
//function prototype
void addToStart(); //add node to beginning of linked list
void addToEnd(); //add node to end of linked list
void removeNodeAt(); //remove node that matches element entered
void printListStart(); //print nodes from start
void printListEnd(); //print node from end
void startlist(); //create NULL list
void menu(); //selection
//global variables
int option, number;
char name[20], gender[10],address[50],description[50];
//declare structure for node
struct node
{
char customer_name[20];
int customer_number;
char gender_[10];
char customer_address[50];
char order_description[50];
struct node *next;
}*newnode, *list, *prev, *temp, *tmpdisplay;
void main()
{
startlist(); //function call to create empty list
do
{
menu(); //function call to show menu
switch (option)
{
case 1: system("cls"); addToStart(); break;
case 2: system("cls"); addToEnd(); break;
case 3: system("cls"); removeNodeAt(); break;
case 4: system("cls"); printListStart(); break;
case 5: system("cls"); printListEnd(); break;
case 6: exit(0);
default:
printf("Invalid Option");
getch();
}
} while (option != 6);
}//end main
void startlist()
{
list = NULL; //create empty list
}
void menu()
{
printf("***LINKED LIST***\n\n");
printf(" 1. Add New Node At Start\n");
printf(" 2. Add New Node At End\n");
printf(" 3. Remove Node\n");
printf(" 4. Print Linked List From Start\n");
printf(" 5. Print Linked List From End\n");
printf(" 6. Quit\n");
printf("\nSelect a task: "); //allow user to select choice
scanf("%d", &option);
}
void addToStart()
{
newnode = (struct node*) malloc(sizeof(struct node)); //allocates memory space for new node
printf("Enter the customer name:\n");
scanf("%s", &name);
printf("Enter then customer number:\n");
scanf("%d", &number);
printf("Enter the Oder Description:\n");
scanf("%s", &description);
printf("Enter the Gender:\n");
scanf("%s", &gender);
printf("Enter the Customer Address:\n");
scanf("%s", &address);
newnode->customer_number = number;
strcpy(newnode->customer_name, name); //using stringcopy to copy name to customer_name in node
strcpy(newnode->order_description, description); //using stringcopy to copy transdes to transaction_description in node
strcpy(newnode->gender_, gender);
strcpy(newnode->customer_address, address);
newnode->next = NULL; //set node pointer to NULL
if (list == NULL)
list = newnode; //if list is empty, node is assigned to list
else
{
newnode->next = list; //if list not empty, newnode pointer equals to list first node
list = newnode; //assign newnode to list, newnode is at the start of the list
}
}
void addToEnd()
{
newnode = (struct node*) malloc(sizeof(struct node)); //allocate new memory space for new node
printf("Enter the customer name:\n");
scanf("%s", &name);
printf("Enter then customer number:\n");
scanf("%d", &number);
printf("Enter the Oder Description:\n");
scanf("%s", &description);
printf("Enter the Gender:\n");
scanf("%s", &gender);
printf("Enter the Customer Address:\n");
scanf("%s", &address);
newnode->customer_number = number;
strcpy(newnode->customer_name, name);
strcpy(newnode->order_description, description);
strcpy(newnode->gender_, gender);
strcpy(newnode->customer_address, address);
newnode->next = NULL;
if (list == NULL)
list = newnode; //if list is empty, assign newnode to list as first node
else
{
temp = list; //list not empty, assign temp as list
while (temp->next != NULL) //while pointer does not point to NULL/empty
{
temp = temp->next; //move to subsequent node
}
temp->next = newnode; //loop exits when last node is reached, last node's pointer points to newnode
}
}
void removeNodeAt()
{
printf("Enter customer number to delete: \n");
scanf("%d", &number);
if (list == NULL) //check if list is empty
printf("\n\nLIST IS EMPTY\n\n");
//if list not empty, match number to cust_no in first node
else if (number == list->customer_number)
{
list = list->next; //match found, first node is skipped (deleted)
}
else //match not found in first node, move to subsequent nodes
{
temp = list; //assign temp as list
while (temp->customer_number != number)
{
//if match not found
prev = temp; //prev is pointing to linked list
temp = temp->next;//temp is pointing to next node
}
printf("Node deleted:");
printf("\n%s\n", prev->customer_name);
printf("%d\n", prev->customer_number);
printf("%s\n\n", prev->gender_);
prev->next = prev->next->next; //match found, skip/jump the node (delete)
}
}
void printListStart()
{
if (list == NULL)
printf("\n\nLIST IS EMPTY\n\n");
else
{
tmpdisplay = list;
while (tmpdisplay != NULL)
{
printf("\n%s\n", tmpdisplay->customer_name);
printf("%d\n", tmpdisplay->customer_number);
printf("%s\n", tmpdisplay->gender_);
printf("%s\n", tmpdisplay->order_description);
printf("%s\n", tmpdisplay->customer_address);
tmpdisplay = tmpdisplay->next;
}
}
}
void printListEnd()
{
}
最佳答案
最简单的方法是创建一个双向链表,其中每个节点都有一个 next 和 previous 指针,其中 next 指向下一个节点(就像您现在所做的那样),previous 指向前一个节点。您还需要指向列表前端和末尾的指针。要反向打印它,从指向最后一个节点的指针开始,然后跟随前一个指针而不是下一个指针。
struct node
{
char customer_name[20];
int customer_number;
char gender_[10];
char customer_address[50];
char order_description[50];
struct node *next;
struct node *prev;
}*newnode, *list, *prev, *temp, *tmpdisplay, *listend;
在末尾添加节点时,prev为新节点监听,set为新节点监听。
关于c - 反向打印链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33810628/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!