C中链表的递归算法

时间:2016-12-21 16:56:38

标签: c algorithm linked-list

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

2 个答案:

答案 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。或者,您可以保留对列表最后一项的引用,并将新项目添加到列表的末尾。