我从维基百科获得了链表(http://en.wikipedia.org/wiki/Linked_list)的代码。
但它以相反的顺序打印结果(5 4 3 2 1)。如何从头开始打印(1 2 3 4 5)。
答案 0 :(得分:1)
我假设你在谈论“语言支持”中的C实现。
不按相反顺序打印。这是因为元素插入到列表的头部,因此插入1,2,3会产生一个包含3,2,1的列表。
这是因为列表由头部表示,因此插入头部比尾部更快。要插入尾部,您必须浏览整个列表。这使得插入O(n)而不是O(1)。
看到这是一个单链表,你不能按照其他顺序打印,因为你只能前进。
答案 1 :(得分:0)
这是因为列表的构建方式。
要反向打印,只需递归到最后一个条目并从那里打印。
答案 2 :(得分:0)
查看以下示例:
/****************************************************************/
/* Function: Add an element to our list */
/* */
/* Parameters: **p is the node that we wish to insert at. */
/* if the node is the null insert it at the beginning */
/* Other wise put it in the next space */
LLIST *list_add(LLIST **p, int i)
{
if (p == NULL) /*checks to see if the pointer points somewhere in space*/
return NULL;
LLIST *n = malloc(sizeof(LLIST)); /* creates a new node of the correct data size */
if (n == NULL)
return NULL;
n->next = *p; /* the previous element (*p) now becomes the "next" element */
*p = n; /* add new empty element to the front (head) of the list */
n->data = i;
return *p;
}
当您致电list_add
时,元素会被添加到链接列表的开头。这是出于效率的原因;你不必横向整个链表插入一个元素(如果你想追加你就必须这样做。)
要反向打印,您可以使用递归,构建自己的堆栈(这是盲人的递归),或者反向重新创建列表。递归版:
void list_print_reverse(LLIST *n)
{
if (n == NULL)
{
printf("list is empty\n");
return;
}
if (n->next != NULL)
{
list_print_reverse(n->next);
}
printf("print %p %p %d\n", n, n->next, n->data);
}
答案 3 :(得分:0)
列表的打印顺序是列表中元素的排列顺序。您可以使用递归以相反的顺序(即按插入的元素的顺序)打印它。以下代码将以相反的顺序打印列表
void list_print(LLIST * n){
if(n == NULL)
{
printf(“list is empty \ n”);
返回;
}
}void print_recursive(LLIST * n){
如果(正>接着== NULL)
的printf( “%d \ n” 个,正>数据);
否则
print_recursive(LLIST n-> next);
}
答案 4 :(得分:0)
我有这个程序使用递归反向打印字符串。你可以用你的链表作为输入吗?
void reversePrint(char *str)
{
if(*str == '\0')
return;
reversePrint(str+1);
printf("%c",*str);
}
int main()
{
char *input;
input = malloc(10);
strcpy(input,"wolfrevo");
reversePrint(input);
}
我可以自己改变它,但希望它对你来说是一个很好的练习。
<强>提示:强>
答案 5 :(得分:0)
您还可以尝试双链表。基本上,您有一个指向前一个元素的附加指针
typedef struct node {
int data;
struct node *next; /* pointer to next element in list */
struct node *previous; /* pointer to previous element in list */
} node;
typedef struct list {
node *head; /* first element in list */
node *tail; /* last element in list */
} list;
然后,您可以从头部和/或尾部打印列表。