2021-11-15

  1. 设以带头结点的双向循环链表表示的线性表为 L=(a1, a2, a3, …,
    an)。试写一时间复杂度 O(n)的算法,将 L 改造为 L=(a1, a3, …, an, …,
    a4, a2)。要求:
    (1)描述算法的基本设计思想;
    (2)根据设计思想,采用 C 语言描述算法,关键之处给出注释。
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
    int data;
    struct node* next;//
    struct node* pre;
} Node;

void InsertDoubleList(Node* head, int val)
{
    Node* ptemp = malloc(sizeof(Node));
    ptemp->data = val;
    ptemp->next = NULL;
    ptemp->pre = NULL;

    if (head->next == NULL && head->pre == NULL)//list NULL
    {
        head->next = ptemp;
        ptemp->pre = head;
        ptemp->next = head;
        head->pre = ptemp;
    }
    else//Insert behind the head node
    {
        ptemp->next = head->next;
        head->next->pre = ptemp;
        ptemp->pre = head;
        head->next = ptemp;
    }
}

void PintfDoubleList(Node* head)//printf double_list
{
    Node* ptemp;
    ptemp = head->next;


    while (ptemp != head)
    {
        printf("<--%d--> ", ptemp->data);
        ptemp = ptemp->next;

    }
    printf("\n");

}
void ChangeList(Node* head)
{
    Node* pcur;//指向头结点的下一个结点
    pcur = head->next;

    head->next = head;//将头结点指向自己
    head->pre = head;
    Node* endnode;
    endnode = head;//尾结点指向头结点


    Node* head2 = malloc(sizeof(Node));//新建一个结点,用于插入奇数项
    head2->data = 0;
    head2->next = head2;
    head2->pre = head2;

    int odd = 1;//用于标记奇偶项

    while (pcur != head)
    {
        Node* ptemp;//用一个临时指针,指向当前结点,用于插入
        ptemp = pcur;

        pcur = pcur->next;//移动到下一个结点

        if (odd == 0)//处理奇数项
        {
            ptemp->next = head2->next;
            head2->next->pre = ptemp;
            ptemp->pre = head2;
            head2->next = ptemp;

            odd = 1;
        }
        else
        {
            ptemp->next = endnode->next;
            ptemp->pre = endnode;
            endnode->next = ptemp;
            endnode = ptemp;
            odd = 0;
        }



    }
    PintfDoubleList(head);
    PintfDoubleList(head2);


   
        endnode->next = head2->next;
        head2->next->pre = endnode;

        head2->pre->next = head;
        head->pre = head2->pre;
    


}

int main()
{
    int arr[6] = { 6,5,4,3,2,1 };


    Node head;//create head node;
    head.data = 0;
    head.next = NULL;
    head.pre = NULL;

    Node* p;
    p = &head;

    int i;
    for (i = 0; i < 6; i++)
    {
        InsertDoubleList(p, arr[i]);
    }
    printf("printf double_list:\n");
    PintfDoubleList(&head);

    Node* head2 = malloc(sizeof(Node));
    head2->data = 0;
    head2->next = NULL;
    head2->pre = NULL;


    ChangeList(&head);
    printf("printf double_list:\n");
    PintfDoubleList(&head);
    return 0;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值