【问题标题】:Try to do a function who swap element of a list尝试做一个交换列表元素的函数
【发布时间】:2022-01-01 22:31:10
【问题描述】:

我想用一个简单的指针来实现这个功能,但它不起作用! 此函数的目标是将第一个元素放在列表的末尾。 例如:a b c d e

                                            b c d e a
typedef struct liste liste_t;
struct liste
{
    int nbr;
    liste_t *next;
};
void put_at_the_end(liste_t *list)
{
    liste_t *temp1 = list;
    liste_t *temp2 = NULL;

    if (list == NULL || list->next == NULL)
        return (list);
    while (list->next->next != NULL)
        list = list->next;
    temp2 = list->next;
    temp2->next = temp1->next;
    temp1->next = NULL;
    list->next = temp1;
}

感谢您的帮助!

【问题讨论】:

  • 您需要能够更改list 指针。但这对于当前的函数原型是不可能的。需要传入liste_t **
  • 如果不更改列表的头部,您将无法执行此操作。通常,您通过返回(可能)新的头,或通过将指针传递给指向头的指针来做到这一点。更好的是,您将指针传递给包含指向头部的指针的列表对象。您的liste_t 类型实际上是node_t。你的函数必须选择:或者它是 void 或者它返回一些东西。
  • 在不需要时避免使用**** 是一个副作用。改用返回值。如果不是绝对必要,应避免副作用。

标签: c


【解决方案1】:
typedef struct list_t
{
    int nbr;
    struct list_t *next;
}list_t;

list_t *addEnd(list_t *head, const int nbr)
{
    list_t *node = malloc(sizeof(*node));

    if(node)
    {
        node -> next = NULL;
        node -> nbr = nbr;
        if(!head) head = node;
        else
        {
            list_t *current = head;
            while(current -> next) current = current -> next;
            current -> next = node;
        }
    }
    else head = NULL;
    return head;
}

list_t *addFront(list_t *head, const int nbr)
{
    list_t *node = malloc(sizeof(*node));

    if(node)
    {
        node -> next = head;
        node -> nbr = nbr;
        head = node;
    }
    else head = NULL;
    return head;
}

list_t *addMiddle(list_t *after, const int nbr)
{
    list_t *node = NULL;

    if(after)
    {
        node = malloc(sizeof(*node));
        if(node)
        {
            node -> next = after -> next;
            after -> next = node;
            node -> nbr = nbr;
        }
    }
    return node;
}

void printList(const list_t *head)
{
    size_t count = 0;
    while(head)
    {
        printf("Node [%2zu] NBR=%03d\n", ++count, head -> nbr);
        head = head -> next;
    }
    printf("Total number of nodes: %zu\n List end------------------\n", count);
}


int main(void)
{
    list_t *head = NULL, *tmp, *some;   

    for(int i = 1; i < 4; i++)
    {
        if((tmp = addEnd(head, i))) head = tmp;
        printList(head);
    }

    if((some = addEnd(head, 5))) head = some;
    printList(head);

    for(int i = 10; i < 15; i++)
    {
        if((tmp = addFront(head, i))) head = tmp;
        printList(head);
    }

    for(int i = 100; i < 105; i++)
    {
        if(!addMiddle(some, i)) printf("Error\n");
        printList(head);
    }
    /* free memory */
}
Node [ 1] NBR=001
Total number of nodes: 1
 List end------------------
Node [ 1] NBR=001
Node [ 2] NBR=002
Total number of nodes: 2
 List end------------------
Node [ 1] NBR=001
Node [ 2] NBR=002
Node [ 3] NBR=003
Total number of nodes: 3
 List end------------------
Node [ 1] NBR=001
Node [ 2] NBR=002
Node [ 3] NBR=003
Node [ 4] NBR=005
Total number of nodes: 4
 List end------------------
Node [ 1] NBR=010
Node [ 2] NBR=001
Node [ 3] NBR=002
Node [ 4] NBR=003
Node [ 5] NBR=005
Total number of nodes: 5
 List end------------------
Node [ 1] NBR=011
Node [ 2] NBR=010
Node [ 3] NBR=001
Node [ 4] NBR=002
Node [ 5] NBR=003
Node [ 6] NBR=005
Total number of nodes: 6
 List end------------------
Node [ 1] NBR=012
Node [ 2] NBR=011
Node [ 3] NBR=010
Node [ 4] NBR=001
Node [ 5] NBR=002
Node [ 6] NBR=003
Node [ 7] NBR=005
Total number of nodes: 7
 List end------------------
Node [ 1] NBR=013
Node [ 2] NBR=012
Node [ 3] NBR=011
Node [ 4] NBR=010
Node [ 5] NBR=001
Node [ 6] NBR=002
Node [ 7] NBR=003
Node [ 8] NBR=005
Total number of nodes: 8
 List end------------------
Node [ 1] NBR=014
Node [ 2] NBR=013
Node [ 3] NBR=012
Node [ 4] NBR=011
Node [ 5] NBR=010
Node [ 6] NBR=001
Node [ 7] NBR=002
Node [ 8] NBR=003
Node [ 9] NBR=005
Total number of nodes: 9
 List end------------------
Node [ 1] NBR=014
Node [ 2] NBR=013
Node [ 3] NBR=012
Node [ 4] NBR=011
Node [ 5] NBR=010
Node [ 6] NBR=001
Node [ 7] NBR=100
Node [ 8] NBR=002
Node [ 9] NBR=003
Node [10] NBR=005
Total number of nodes: 10
 List end------------------
Node [ 1] NBR=014
Node [ 2] NBR=013
Node [ 3] NBR=012
Node [ 4] NBR=011
Node [ 5] NBR=010
Node [ 6] NBR=001
Node [ 7] NBR=101
Node [ 8] NBR=100
Node [ 9] NBR=002
Node [10] NBR=003
Node [11] NBR=005
Total number of nodes: 11
 List end------------------
Node [ 1] NBR=014
Node [ 2] NBR=013
Node [ 3] NBR=012
Node [ 4] NBR=011
Node [ 5] NBR=010
Node [ 6] NBR=001
Node [ 7] NBR=102
Node [ 8] NBR=101
Node [ 9] NBR=100
Node [10] NBR=002
Node [11] NBR=003
Node [12] NBR=005
Total number of nodes: 12
 List end------------------
Node [ 1] NBR=014
Node [ 2] NBR=013
Node [ 3] NBR=012
Node [ 4] NBR=011
Node [ 5] NBR=010
Node [ 6] NBR=001
Node [ 7] NBR=103
Node [ 8] NBR=102
Node [ 9] NBR=101
Node [10] NBR=100
Node [11] NBR=002
Node [12] NBR=003
Node [13] NBR=005
Total number of nodes: 13
 List end------------------
Node [ 1] NBR=014
Node [ 2] NBR=013
Node [ 3] NBR=012
Node [ 4] NBR=011
Node [ 5] NBR=010
Node [ 6] NBR=001
Node [ 7] NBR=104
Node [ 8] NBR=103
Node [ 9] NBR=102
Node [10] NBR=101
Node [11] NBR=100
Node [12] NBR=002
Node [13] NBR=003
Node [14] NBR=005
Total number of nodes: 14
 List end------------------

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2020-11-23
    • 2011-09-02
    相关资源
    最近更新 更多