【无标题】

题目

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%2
0)
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%2
0)
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;
}
运行结果

在这里插入图片描述

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览 29624 人正在系统学习中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值