我有一个我命名乘客的结构,按字母顺序排序,我将复制到一个链接列表,其元素与结构相同。 什么是颠倒列表元素顺序的最佳算法,以便我可以轻松地按字母顺序打印出来?当然,如果它遇到的第一个值是NULL
,我的打印不起作用typedef struct
{
char fullname[40];
unsigned short phonenr[10];
unsigned int seatnr;
}PASSENGERS;
typedef struct list1
{
char fullname[40];
struct list1 *next;
}LIST1;
int main()
{
selectsortnm(passenger); /*A function I use to sort alphabetically*/
LIST1 *list1, *start=NULL;
int i=0;
while (strcmp(passenger[i].fullname,"\0")!=0);
{
list1 = (LIST1 *) malloc (sizeof(LIST1));
list1->next = NULL;
strcpy(list1->fullname,passenger[i].fullname);
if (start ==NULL)
{
start = list1;
i++;
}
else
{
list1->next = start;
start = list1;
i++;
}
}
//Recursive algorithm
LIST1 *current = list1;
while (current !=NULL)
{
printf("%s",current->fullname);
current = current->next;
}
}
答案 0 :(得分:1)
假设一个单链表,确实是递归遍历会以相反的顺序打印它...如果堆栈当然有足够的空间:
void printListRev(struct LIST *p)
{
if (!p) return;
printListRev(p->next);
printf("%s\n", p->data);
}
答案 1 :(得分:1)
您不需要递归算法来反转列表。您只需更改插入列表的方式即可。
这是您将项目插入列表的方式:
list1 = make_list_item_from(passengers[i]);
list1->next = start;
start = list1;
i++;
假设passengers
已排序,插入列表前面会产生一个与乘客顺序相反的列表。
要解决此问题,您可以在插入列表时向后走passengers
。或者,您可以保留对列表最后一项的引用,并将新项目添加到列表的末尾。