在遍历原始列表的同时创建一个新列表
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
这看起来像你想要的。
我的任务是在遍历原始列表的同时创建一个新列表,并将原始列表中的项目添加到第二个列表的前面,然后打印第二个列表“第一个列表”。不使用递归的反向链表**
我的大部分工作都在 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
这看起来像你想要的。