【问题标题】:Recursive Algorithm for Linked List in CC中链表的递归算法
【发布时间】:2017-05-07 04:27:39
【问题描述】:

我有一个我命名为乘客的结构,它按字母顺序排序,我将其复制到一个与结构具有相同元素的链表中。 颠倒列表元素顺序的最佳算法是什么,以便我可以轻松地按字母顺序打印出来?现在,如果遇到的第一个值为 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;
    }
}

【问题讨论】:

  • 你的问题不清楚。还有什么是 LIST1 ?请分享易于理解的代码。
  • 我们需要一个linked-list.stackoverflow.com,这样我们就可以过滤掉一半的问题。
  • 使用双向链表可以通过向后遍历来解决问题。此外(这更像是解决方法)您可以在创建列表时向后遍历 passengers 数组,但您需要 2 个循环:1 获取最后一个索引(最后一个记录,其 fullname 不是 @ 987654323@),第二个:从前一个循环找到的索引循环到0。嗯,但这两种方法都没有递归性。
  • 感谢大家的cmets,我对此很陌生,但没有任何借口..
  • //Recursive algorithm之后的代码不是递归的。

标签: c algorithm linked-list


【解决方案1】:

假设一个单链表,递归遍历确实会以相反的顺序打印它......当然如果堆栈有足够的空间:

void printListRev(struct LIST *p)
{
    if (!p) return;
    printListRev(p->next);
    printf("%s\n", p->data);
}

【讨论】:

    【解决方案2】:

    您不需要递归算法来反转您的列表。您可以更改插入列表的方式。

    这是您将项目插入列表的方式:

            list1 = make_list_item_from(passengers[i]);
            list1->next = start;
            start = list1;
            i++;
    

    假设 passengers 已排序,在列表的前面插入会导致与乘客顺序相反的列表。

    为了解决这个问题,您可以在插入列表时向后走passengers。或者,您可以保留对列表最后一项的引用,并将新项目添加到列表末尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      相关资源
      最近更新 更多