在遍历原始列表的同时创建一个新列表

Create a new list while traversing the original one

我的任务是在遍历原始列表的同时创建一个新列表,并将原始列表中的项目添加到第二个列表的前面,然后打印第二个列表“第一个列表”。不使用递归的反向链表**

我的大部分工作都在 addItemToSecondListInreversed 函数中。我真的需要帮助。我得到第一个列表的最后一项,即 9,但其他项目仍然缺失。我觉得我需要做一个循环,让它从最后一个循环到第一个,但我不知道怎么做。

#include <stdio.h>
#include <stdlib.h>

typedef struct tagSingleLinkedList {
    int data; // A single integer will be stored as data
    struct tagSingleLinkedList* next;
}SLLI; // Single Linked List Item


 void reverse(SLLI* head);
void print_list(SLLI* head);
SLLI* AddItemToEnd(SLLI* head, int dataToAdd);
SLLI* AddItemToFront(SLLI* head, int dataToAdd);
SLLI* addItemToSecondListInreversed(SLLI* head);

int main(int argc, char** argv)
{
    SLLI* head = NULL; // This means the list hasn't got any items
    int i;

    for (i = 0; i < 10; i++)
       head = AddItemToEnd(head, i);

    printf("Print list...\n");
    print_list(head);

    printf("----------------------------------\n");
    SLLI* printReverse(SLLI* head, int dataToAdd);
   head = addItemToSecondListInreversed(head);

 print_list(head);
}

SLLI* AddItemToEnd(SLLI* head, int dataToAdd)
{
    SLLI* last;

    // 1-) Allocate memory for a new SLLI item
    SLLI* pItem = (SLLI*) malloc(sizeof(SLLI));
    if (NULL == pItem) {
        printf("Cannot allocate memory for the new item!!!\n");
        exit(1);
    }
    // 2-) Put data into SLLI item
    pItem->data = dataToAdd;
    //3-) Set the next item as NULL (Because the new item will be the last item in the list!)
    pItem->next = NULL;


    //Case 0-) If the list doesn’t have any items – EMPTY LIST
    if (NULL == head)
        return pItem;

    //Case 1-) If the linked list has at least one item
    // STEP 1-) Proceed to the last item in the list
    last = head;
    while (NULL != last->next)
        last = last->next;
    // After while loop "last" point the last item in the list

    // STEP 3-) Add new item after the last item!
    last->next = pItem;

    return head;
}


SLLI* addItemToSecondListInreversed(SLLI* head){
    SLLI* last =head;
    SLLI* newHead;

    if(NULL !=last){
    while (NULL != last->next)
        last = last->next;


    AddItemToFront(last,last->data);


       // printf("%d\n", last->data);
   // last = last->next;
    }

    }


SLLI* AddItemToFront(SLLI* head, int dataToAdd)
{
    // STEP 1-) Allocate memory for the new item
    //------------------------------------------
    // 1-) Allocate memory for a new SLLI item
    SLLI* pItem = (SLLI*) malloc(sizeof(SLLI));
    if (NULL == pItem) {
        printf("Cannot allocate memory for the new item!!!\n");
        exit(1);
    }
    // 2-) Put data into SLLI item
    pItem->data = dataToAdd;

    // STEP 2-) Add new item in front of the list!
    //--------------------------------------------
    pItem->next = head;

    // return the new item's address as the new HEAD of the list!
    return pItem;
}

//printing list
void print_list(SLLI* head) {
    SLLI* temp = head;

    while (temp != NULL) {
        printf("%d\n", temp->data);
        temp = temp->next;
    }
}

您在 main() 中的声明 SLLI* printReverse(SLLI* head, int dataToAdd); 没有任何用处;该函数未被调用,几行后声明超出范围。您不应该在另一个函数内声明函数(在文件范围或 header 中声明)。

您在 addItemToSecondListInreversed() 中对 AddItemToFront() 的调用 — 为什么 reversed 中的第一个 r 没有大写?一致性在编程中很重要! - 多次出现缺陷。您应该将 newHead 的初始化值传递给 AddItemToFront() 而不是 last,并且您应该在 newHead 中捕获 return 值。您还需要从函数中 return newHead 。就目前而言,您在阅读列表时弄乱了您试图阅读的列表——这不会有任何好处。而且您没有 return 在应该或初始化 newHead.

时输入值

您还需要在扫描第一个列表的循环中调用 AddItemToFront()

将这些更改付诸行动,稍微清理一下代码,添加一个函数 freeList() 来发布列表,并使用 camelCaseNames() 重命名函数产生:

#include <stdio.h>
#include <stdlib.h>

typedef struct tagSingleLinkedList
{
    int data;
    struct tagSingleLinkedList *next;
} SLLI;

static void printList(SLLI *head);
static SLLI *addItemToEnd(SLLI *head, int dataToAdd);
static SLLI *addItemToFront(SLLI *head, int dataToAdd);
static SLLI *createReversedList(SLLI *head);
static void freeList(SLLI *head);

int main(void)
{
    SLLI *head = NULL;
    int i;

    for (i = 0; i < 10; i++)
        head = addItemToEnd(head, i);

    printf("Print list...\n");
    printList(head);
    printf("----------------------------------\n");

    SLLI *revd = createReversedList(head);

    printf("Reversed list:\n");
    printList(revd);

    freeList(head);
    freeList(revd);

    return 0;
}

SLLI *addItemToEnd(SLLI *head, int dataToAdd)
{
    SLLI *last;

    SLLI *pItem = (SLLI *) malloc(sizeof(SLLI));
    if (NULL == pItem)
    {
        printf("Cannot allocate memory for the new item!!!\n");
        exit(1);
    }

    pItem->data = dataToAdd;
    pItem->next = NULL;

    if (NULL == head)
        return pItem;

    last = head;
    while (NULL != last->next)
        last = last->next;

    last->next = pItem;

    return head;
}

static SLLI *createReversedList(SLLI *head)
{
    SLLI *newHead = NULL;

    while (head != NULL)
    {
        newHead = addItemToFront(newHead, head->data);
        head = head->next;
    }
    return newHead;
}

static SLLI *addItemToFront(SLLI *head, int dataToAdd)
{
    SLLI *pItem = (SLLI *) malloc(sizeof(SLLI));
    if (NULL == pItem)
    {
        fprintf(stderr, "Cannot allocate memory for the new item!!!\n");
        exit(1);
    }

    pItem->data = dataToAdd;
    pItem->next = head;

    return pItem;
}

static void printList(SLLI *head)
{
    while (head != NULL)
    {
        printf("%d\n", head->data);
        head = head->next;
    }
}

static void freeList(SLLI *head)
{
    while (head != NULL)
    {
        SLLI *next = head->next;
        free(head);
        head = next;
    }
}

输出:

Print list...
0
1
2
3
4
5
6
7
8
9
----------------------------------
Reversed list:
9
8
7
6
5
4
3
2
1
0

这看起来像你想要的。