【发布时间】:2020-11-22 13:37:17
【问题描述】:
在链表 S(sentinel)->1->2->3->4->5->6->S 的每一端都有一个带有哨兵的链表(类似这样)。我必须交换相邻元素: S->1->2->3->4->5->S 到 S->2->1->4->3->5->S 但代码改为:2->1->4->3->-842150451。此代码适用于每种输入:S->1->2->S、S->1->S 等。我必须在原始代码中建立一个新的列表连接。禁止更改节点中的整数值。我相信我的 void reverse_pairs(list* head) 函数很糟糕,但我现在不知道如何让它工作。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
typedef struct _list {
int a;
struct _list* next;
}list;
void reverse_pairs(list* head)
{
if (head)
{
for (; head->next && head->next->next; head = head->next->next)
{
list* tmp = head->next;
head->next = head->next->next;
tmp->next = head->next->next;
head->next->next = tmp;
}
}
}
list* makesentinel()
{
list* stra1 = (list *)malloc(1 * sizeof(list));
list* stra2 = (list*)malloc(1 * sizeof(list));
stra1->next = stra2;
stra2->next = NULL;
return stra1;
}
void push(list* head_ref, int new_data)
{
list* new_list = (list*)malloc(sizeof(list));
new_list->a = new_data;
new_list->next = head_ref->next;
head_ref->next = new_list;
}
void print(struct _list* node)
{
list* temp = NULL;
temp = node->next;
while (temp->next != NULL) {
printf("%d ", temp->a);
temp = temp->next;
}
}
int main()
{
list* start = NULL;
start = makesentinel();
push(start, 5);
push(start, 4);
push(start, 3);
push(start, 2);
push(start, 1);
printf("before\n");
print(start);
reverse_pairs(start);
printf("\nafter\n");
print(start);
return 0;
}
【问题讨论】:
标签: c pointers linked-list sentinel