插入到双向链表的头部和尾部——只打印出最后插入的尾部项目
Inserting to head and tail of a doubly linked list -- only prints out last tail item inserted
我正在尝试实现一个双向链表以便为考试学习,但是 运行 在将项目插入尾部时遇到了一些麻烦 -- 当我只插入到头部时它打印正确在列表中。但是,当我插入到列表的尾部时,只打印出最后一个尾部项目。以下是我的完整代码:
/*
- Q2: Write a function that takes a LinkedList struct pointer and inserts at the head of the linked list.
- Q3. Write a function that takes a LinkedList struct pointer and frees all memory associated with it. (
For a solution, see fancy-linked-lists.c, attached above.)
- Q4 Review all the functions from today's code and give their big-oh runtimes.
- Q5: Implement functions for doubly linked lists:
- tail_insert(),
- head_insert(),
- tail_delete(),
- head_delete(),
- delete_Nth().
- Repeat these exercises with doubly linked lists in which you maintain a tail pointer.
- How does the tail pointer affect the runtimes of these functions?
- Are any of these functions more efficient for doubly linked lists with tail pointers than they are for singly linked lists with tail pointers?
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
struct node *prev;
} node;
node *createNode(int data)
{
node *ptr = NULL;
ptr = malloc(sizeof(node));
if(ptr == NULL)
{
printf("space could not be allocated\n");
return NULL;
}
ptr->data = data;
ptr->next = NULL;
ptr->prev = NULL;
return ptr;
}
node *tailInsert(node *head, int data)
{
if(head->next == NULL)
{
node *temp;
temp = createNode(data);
temp->next = NULL;
temp->prev = head;
head->next = temp;
return head;
}
tailInsert(head->next, data);
}
node *frontInsert(node *head, int data)
{
node *newHead;
if(head == NULL)
{
return createNode(data);
}
newHead = createNode(data);
newHead->next = head;
newHead->prev = NULL;
return newHead;
}
node *destroy_linked_list(node *list)
{
/*if (list == NULL)
return NULL;
// Free the entire list within this struct.
destroy_list(list->head);
// Free the struct itself.
free(list);
return NULL;
*/
}
void printList(node *head)
{
if (head == NULL)
{
printf("Empty List\n");
return;
}
for(; head != NULL; head = head->next)
printf("%d ", head->data);
printf("\n");
}
int main(void)
{
node *head = NULL;
head = frontInsert(head, 1);
head = frontInsert(head, 2);
head = frontInsert(head, 3);
head = tailInsert(head, 4);
head = tailInsert(head, 5);
head = tailInsert(head, 6);
printList(head);
system("PAUSE");
return 0;
}
感谢您的帮助!
您正在从 tailInsert 返回 temp(最后一个节点)并分配给 head。如果在尾部插入,请不要更改头指针。
void tailInsert(node *head, int data)
{
if(head->next == NULL)
{
node *temp;
temp = createNode(data);
temp->next = NULL;
temp->prev = head;
head->next = temp;
return ;
}
tailInsert(head->next, data);
}
如果调用 tailInsert
函数
,请不要在 main 中为 head 分配任何内容
我正在尝试实现一个双向链表以便为考试学习,但是 运行 在将项目插入尾部时遇到了一些麻烦 -- 当我只插入到头部时它打印正确在列表中。但是,当我插入到列表的尾部时,只打印出最后一个尾部项目。以下是我的完整代码:
/*
- Q2: Write a function that takes a LinkedList struct pointer and inserts at the head of the linked list.
- Q3. Write a function that takes a LinkedList struct pointer and frees all memory associated with it. (
For a solution, see fancy-linked-lists.c, attached above.)
- Q4 Review all the functions from today's code and give their big-oh runtimes.
- Q5: Implement functions for doubly linked lists:
- tail_insert(),
- head_insert(),
- tail_delete(),
- head_delete(),
- delete_Nth().
- Repeat these exercises with doubly linked lists in which you maintain a tail pointer.
- How does the tail pointer affect the runtimes of these functions?
- Are any of these functions more efficient for doubly linked lists with tail pointers than they are for singly linked lists with tail pointers?
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
struct node *prev;
} node;
node *createNode(int data)
{
node *ptr = NULL;
ptr = malloc(sizeof(node));
if(ptr == NULL)
{
printf("space could not be allocated\n");
return NULL;
}
ptr->data = data;
ptr->next = NULL;
ptr->prev = NULL;
return ptr;
}
node *tailInsert(node *head, int data)
{
if(head->next == NULL)
{
node *temp;
temp = createNode(data);
temp->next = NULL;
temp->prev = head;
head->next = temp;
return head;
}
tailInsert(head->next, data);
}
node *frontInsert(node *head, int data)
{
node *newHead;
if(head == NULL)
{
return createNode(data);
}
newHead = createNode(data);
newHead->next = head;
newHead->prev = NULL;
return newHead;
}
node *destroy_linked_list(node *list)
{
/*if (list == NULL)
return NULL;
// Free the entire list within this struct.
destroy_list(list->head);
// Free the struct itself.
free(list);
return NULL;
*/
}
void printList(node *head)
{
if (head == NULL)
{
printf("Empty List\n");
return;
}
for(; head != NULL; head = head->next)
printf("%d ", head->data);
printf("\n");
}
int main(void)
{
node *head = NULL;
head = frontInsert(head, 1);
head = frontInsert(head, 2);
head = frontInsert(head, 3);
head = tailInsert(head, 4);
head = tailInsert(head, 5);
head = tailInsert(head, 6);
printList(head);
system("PAUSE");
return 0;
}
感谢您的帮助!
您正在从 tailInsert 返回 temp(最后一个节点)并分配给 head。如果在尾部插入,请不要更改头指针。
void tailInsert(node *head, int data)
{
if(head->next == NULL)
{
node *temp;
temp = createNode(data);
temp->next = NULL;
temp->prev = head;
head->next = temp;
return ;
}
tailInsert(head->next, data);
}
如果调用 tailInsert
函数