C 带哨兵的链表

C 带哨兵的链表,c,pointers,linked-list,sentinel,C,Pointers,Linked List,Sentinel,在列表S(sentinel)->1->2->3->4->5->6->S的每一端都有一个带有sentinel的链接列表(类似于这样)。我必须交换相邻元素:S->1->2->3->4->5->S到S->2->1->4->3->5->S,但是代码会这样做:2->1->4->3->84215051。这个代码应该适用于各种输入:S->1->2->S,S->1->S,等等。我必须在原始代码中建立一个新的列表连接。禁止更改节点中整数的值。我相信我的void reverse_pairs(list*head)函数

在列表S(sentinel)->1->2->3->4->5->6->S的每一端都有一个带有sentinel的链接列表(类似于这样)。我必须交换相邻元素:S->1->2->3->4->5->S到S->2->1->4->3->5->S,但是代码会这样做:2->1->4->3->84215051。这个代码应该适用于各种输入: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;
}
#包括
#包括
#包括
#包括
类型定义结构列表{
INTA;
结构列表*下一步;
}名单;
无效反向对(列表*头)
{
若有(总目)
{
对于(;head->next&&head->next->next;head=head->next->next)
{
列表*tmp=head->next;
头部->下一步=头部->下一步->下一步;
tmp->next=head->next->next;
head->next->next=tmp;
}
}
}
列表*makesentinel()
{
list*stra1=(list*)malloc(1*sizeof(list));
list*stra2=(list*)malloc(1*sizeof(list));
stra1->next=stra2;
stra2->next=NULL;
返回通道1;
}
无效推送(列表*头部参考,内部新数据)
{
列表*新列表=(列表*)malloc(sizeof(列表));
新建_列表->a=新建_数据;
新建列表->下一步=标题参考->下一步;
head\u ref->next=新建\u列表;
}
无效打印(结构列表*节点)
{
list*temp=NULL;
temp=节点->下一步;
while(临时->下一步!=NULL){
printf(“%d”,temp->a);
温度=温度->下一步;
}
}
int main()
{
list*start=NULL;
start=makesentinel();
推(启动,5);
推(启动,4);
推(启动,3);
推送(启动,2);
推送(启动,1);
printf(“之前”);
打印(开始);
反向对(启动);
printf(“\n之后\n”);
打印(开始);
返回0;
}

您的问题是,您从未测试最后一对是否完整。如果您的链表包含偶数个元素,则代码工作正常(只需尝试添加
push(start,6);

因此,您必须在
反向对中进一步测试一步:

void reverse_pairs(list* head)
{
    if (head)
    {
        for (; head->next && head->next->next && head->next->next->next; head = head->next->next)
        {
            ...