从头开始打印链表

时间:2010-07-28 11:19:44

标签: c linked-list

我从维基百科获得了链表(http://en.wikipedia.org/wiki/Linked_list)的代码。

但它以相反的顺序打印结果(5 4 3 2 1)。如何从头开始打印(1 2 3 4 5)。

6 个答案:

答案 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);
}

我可以自己改变它,但希望它对你来说是一个很好的练习。

<强>提示:

  1. 传递链接列表而不是字符串//更改原型
  2. 检查列表为NULL
  3. 通过传递链接列表的下一个元素递归
  4. 在列表中打印数据而不是字符串

答案 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;

然后,您可以从头部和/或尾部打印列表。