题目
4)具有n个整数的无序序列采用带头结点的单向循环链表进行存储,请基于给定的函数,实现Sort函数,将所有奇数移到所有偶数之前,要求在原链表中进行操作,时间复杂度为O(n)。(15分)
struct Node;
typedef struct Node *PNode;
struct Node{
int value;
PNode link;
};
typedef PNode LinkList;
LinkList createEmptyList()
{
LinkList list;
PNode node=(PNode) malloc (sizeof(struct Node));
node->link=node;
list=node;
return list;
}
LinkList insertElement(LinkList list, int x)
{
PNode node=(PNode) malloc (sizeof(struct Node));
node->value=x;
node->link=list->link;
list->link=node;
list=node;
return list;
}
//将所有奇数移到所有偶数之前
LinkList Sort(LinkList list)
{
……
}
广告
若有同学需要桂林电子科技大学数据结构考研真题和答案解析(个人制作)或指定参考书《算法与数据结构》第三版张乃孝PDF等资料的欢迎交流(QQ((肆+壹)幺幺)&微信(月球不太圆)15577498906)
算法思路
新建指针pq,p指向奇数向下走,q指到偶数向下走。从头结点之后的第一个偶数元素遍历,一直到最后一个,判断是奇数还是偶数。若p指针指向偶数,则p指针停下,q指针向前走,直到q指针指向奇数。这时双方的value互换,p继续向下走,直到p或q有一个走到了头结点。因为指针从第一个元素移动到最后一个元素,没有后退,故时间复杂度为O(n)。
代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct Node;
typedef struct Node *PNode;
struct Node{
int value;
PNode link;
};
typedef PNode LinkList;
LinkList createEmptyList()
{
LinkList list;
PNode node=(PNode)malloc(sizeof(struct Node));
node->value=11111;
node->link=node;
list=node;
return list;
}
LinkList insertElement(LinkList list,int x)
{
PNode node=(PNode)malloc(sizeof(struct Node));
node->value=x;
node->link=list->link;
list->link=node;
list=node;
return list;
}
LinkList insert1Element(LinkList list,int x)
{
PNode node=(PNode)malloc(sizeof(struct Node));
node->value=x;
node->link=list->link->link;
list->link->link=node;
return list;
}
//将所有奇数移到所有偶数之前
LinkList Sort1(LinkList list)
{
LinkList list1;
list1=createEmptyList();
PNode p=list->link->link;
while(p->value%21)
p=p->link;
q=p;
while(p!=list->link)
{
if(p->value%20)
list1=insertElement(list1,p->value);
else
list1=insert1Element(list1,p->value);
p=p->link;
}
return list1;
}
void putList(LinkList list)
{
PNode p=list->link->link;
while(p!=list->link)
{
cout<<p->value<<" ";
p=p->link;
}
cout<<endl;
}
LinkList Sort(LinkList list)
{
int temp;
PNode p,q;//p指向奇数向下走,q指到偶数向下走
q=p=list->link->link;
while(p!=list->link&&q!=list->link)
{
if(p->value%21)
p=p->link;
q=p->link;//与源代码不同的地方
else
{
if(q->value%20)
q=q->link;
else
{//交换两者的位置
temp=q->value;
q->value=p->value;
p->value=temp;
putList(list);
}
}
}
return list;
}
int main(int argc, char** argv) {
LinkList list=createEmptyList();
int n,i;
cout<<“请输入10个数”<<endl;
for(i=0;i<10;i++)
{
cin>>n;
list=insertElement(list,n);
}
putList(list);
list=Sort(list);
putList(list);
return 0;
}
运行结果