- 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/
我能否获得一个具有两个参数的递归Prolog谓词,称为反向,它返回列表的反向: 示例查询和预期结果: α-反向([a,b,c],L)。 L = [c,b,a]。 由两个称为palindrome的参数组
在使用 get_dummies() 将分类数据转换为数字数据后,我的数据框看起来像这样 score1 score2 country_CN country _AU category_leader ca
我有一张 table ,上面有一个国家/地区列表。说这些国家之一是“马其顿” 如果搜索“马其顿共和国”,什么 SQL 查询会返回“马其顿”记录? 我相信在 linq 中它会是这样的 var count
我们有一个角色继承结构,它假设每个人都默认获得最低级别的角色,而不是最高级别的过滤,如下图所示: role.Everyone //lowest level; everyone gets this ro
我正在使用 $.each() 解析数组,但在其中,我使用 .splice() 方法,因此我需要向后迭代。这可能吗? var store = [...]; //... var rules = [...]
我有一个 SPLObjectStorage 对象,其中 Player 对象作为键,分数作为与之关联的信息。玩家对象按照从最高分到最低分的顺序添加到存储中,但我现在需要以相反的顺序遍历它们。 我还需要能
我无法理解这一点:如果我给 Prolog reverse([], A). 它工作得很好,如果我给它 reverse(A, [] ). 并根据第一个建议回答 ; 它挂起!为什么? (GNU Prolog
我有一个 SPLObjectStorage 对象,其中 Player 对象作为键,分数作为与之关联的信息。玩家对象按照从最高分到最低分的顺序添加到存储中,但我现在需要以相反的顺序遍历它们。 我还需要能
我有一个HashMap看起来像: HashMap playerHashMap = new HashMap<>(); 玩家是包含姓名、号码、年龄等的对象。 现在我已经对它进行了排序,它看起来像这样: k
我有这个: file://localhost/Volumes/Untitled%20RAID%20Set%201/Callum/iTunes/Music/Steppenwolf/Steppenwolf
我正在使用 std::regex 并希望找到与某个用户定义的正则表达式字符串匹配的字符串中的最后一个位置。 例如,给定正则表达式 :.* 和字符串“test:55:last”,我想找到“:last”,
有一个表 ServErog(服务),它被重新引导到 4 个表 ServA、ServB、ServC、ServD(它们是不同的非统一服务),其中包含 servtype(服务类型)和 type_id(来自其
这个问题在这里已经有了答案: What is the best way to convert date from JavaScript string in format YYYYMMDD to Ja
我知道如何获得包含几个词的所有结果: SELECT * FROM `table` WHERE MATCH (`row`) AGAINST ('+word1 +word2' IN BOOLEAN MOD
你好,我有这个 html 代码: .container{ width: 450; height: 400; border:1px solid
我想知道是否有任何方法可以使用相同的 CSS 过渡实例来将其向前移动然后向后/向后移动。例如,假设我有这种转变: @-webkit-keyframes fade-transition { fr
假设我有这些字符串: char ref[30] = "1234567891234567891"; char oth[30] = "1234567891234567891"; 我想在 C++ 中使用 S
所以我有这段代码,它使 xcode 崩溃 void strrev(const std::string& str) { for(size_t i=str.length();i>=0;i--)
我正在使用下面的代码使每张图片 1 对 1 淡入淡出。我怎样才能反向执行此操作以使图片以相反的顺序加载? img {display:none;} $('img').each(function(
我正在尝试弄清楚如何改变 FrameLayout 堆叠其子项的方式。 目前它是最新的(先进先出)。我想更改它,使最新的 child 位于底部(FILO)。我试着查看 FrameLayout 的源代码,
我是一名优秀的程序员,十分优秀!