本题要求实现一个函数,实现对单循环链表中奇数和偶数结点的移动,要求奇数在前面,偶数在后面,且结点之间的相对顺序不变。
函数接口定义:
PNode Move_Odd_Even(LinkList tail);
tail是单循环链表的尾指针
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
struct Node {
DataType data;
struct Node* next;
};
typedef struct Node *PNode;
typedef struct Node *LinkList;
LinkList CreateList_Tail_loop()
{
LinkList head = (LinkList)malloc(sizeof(struct Node));
PNode cur = NULL;
PNode tail = head;
DataType data;
scanf("%d", &data);
while (data != -1)
{
cur = (struct Node*)malloc(sizeof(struct Node));
cur->data = data;
tail->next = cur;
tail = cur;
scanf("%d", &data);
}
tail->next = head;
return tail;
}
PNode Move_Odd_Even(LinkList tail)
{
@@
}
void print(LinkList tail)
{
PNode head = tail->next;
PNode p = head->next;
while (p != head)
{
printf("%d ", p->data);
p = p->next;
}
}
void DestoryList_Link(LinkList tail)
{
PNode pre = tail->next;
PNode p = pre->next;
while (p != tail)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
free(tail);
}
int main()
{
LinkList tail = NULL;
LinkList p = NULL;
tail = CreateList_Tail_loop();
p = Move_Odd_Even(tail);
print(p);
DestoryList_Link(tail);
return 0;
}
函数实现`
PNode Move_Odd_Even(LinkList tail)
{
PNode last=tail;//记录尾指针,用于存储操作好的节点
PNode temp=tail->next;
PNode head=tail->next;//记录头节点
PNode curr=tail->next->next;//当前遍历操作的节点
PNode pre=tail->next;//curr的前驱节点
tail->next=NULL;
while(1)
{
if(curr==tail)
break;//遍历结束
if(curr->data%2==0)//遇到偶数节点,操作排列奇数节点
{
pre->next=curr->next;
curr->next=NULL;
last->next=curr;
last=curr;
curr=pre->next;
}
else
{
pre=curr;
curr=curr->next;
}
}
if(tail->data%2==0)
{
pre->next=curr->next;
curr->next=NULL;
last->next=curr;
last=curr;
}
last->next=temp;
tail=last;
return tail;
}