求助-琏表的插入算法???

hua_zhixing_ 2009-03-12 09:31:30
……
typedef struct node{
char data;
struct node *next;//struct
}Linklist;
……
void insert(){
Linklist *s;
s=(Linklist *)malloc(LEN);
s->data=b;
q=head;
while(q!=p)
q=q->next;
s->next=q->next;
q=s;
}
……

其中p已知。
...全文
77 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
九头鸟 2009-03-12
  • 打赏
  • 举报
回复
template<class T>
class ChainNode{
friend Chain<T>;
template <class T> friend ostream& operator<<(ostream& os, const Chain<T>& c);
private:
T data;
ChainNode<T>* link;
};

template<class T>
class Chain{
friend ChainIterator<T>;
private:
ChainNode<T>* first;
bool Bubble(ChainNode<T>* current); // 递归函数,从链表的最后一对数开始冒泡至current
pubilc:
void InsertionSort(); //插入算法对链表进行升序排序,不得创建新结点和删除老结点
void BubbleSort(); // 冒泡排序
void SelectionSort(); // 选择排序
void RankSort(); // 计数排序
};

template <class T>
void Chain<T>::InsertionSort() //插入算法对链表进行升序排序,不创建新结点和删除老结点
{

if (first)

for (ChainNode<T>* current = first; current->link;){ // current->link为当前要插入的数据

for (ChainNode<T>* p = first; p->data < current->link->data; p = p->link); // p指向表中第一个大于或等于当前要插入数据的数据
if (p == current->link){ // 表中没有比current->link大的数据
current = current->link;
continue; // 继续下一个数据插入
}
if (p!= current){ // 将要插入的数据挪到第一个比它大的数后面
ChainNode<T>* n = current->link->link;
current->link->link = p->link;
p->link = current->link;
current->link = n;
}
else
current = current->link; // 如果已经在第一个比他大的数后面了,更新current->link
T x = p->link->data; //交换要插入元素和他前面那个比它大的元素
p->link->data = p->data;
p->data = x;

}

}
// 问题1:插入排序对于已排好序的链表仍需检验n(n - 1)次,能否及时终止插入排序?

template <class T>
bool Chain<T>::Bubble(ChainNode<T>* current) // 递归函数,从链表的最后一对数开始冒泡至current
{
bool sorted = true; // 如果链表已排好序(未发生交换),返回true
if (current && current->link && current->link->link)
sorted = Bubble(current->link);
if (current->data > current->link->data){
T temp = current->data;
current->data = current->link->data;
current->link->data = temp;
sorted = false;
}
return sorted;
}

template <class T>
void Chain<T>::BubbleSort() // 冒泡排序
{
bool sorted = false;
for (ChainNode<T>* start = first; start && start->link && !sorted; start = start->link)
sorted = Bubble(start);
}
问题2:不使用递归函数能否以同样的检索次数排序?

template <class T>
void Chain<T>::SelectionSort() // 选择排序
{
bool sorted = false;
for (ChainNode<T>* start = first; start && start->link && !sorted; start = start->link){
sorted = true;
for (ChainNode<T>* current = start->link; current; current = current->link){
if (current->data < start->data){ // 交换
T temp = current->data;
current->data = start->data;
start->data = temp;
}
if (sorted && current->link &¤t->data > current->link->data) // 如果在链表中存在比后一项大的项,则表示未排序
sorted = false;
}
}
}
liusichen_0 2009-03-12
  • 打赏
  • 举报
回复
或者
s->next = p;
while(q->next != s->next)
{
q = q->next;
}
q->next = s;
topwork 2009-03-12
  • 打赏
  • 举报
回复
你是想把s插到p的前面吗?那么就想下面写:


while(q->next != p)
{
q = q->next;
}
q->next = s;
s->next = p;

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧