双向循环链表、冒泡、选择排序

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
  int data;
  struct node *nex;
  struct node *pre;
}NODE;

void Add_HData(NODE*,int);
void Show_tdata(NODE*head);
void Sort_the_bubbling(NODE*head);
void Show_hdata(NODE*head);
void selection_sort(NODE*head) ;
int num;


int main()
{
  NODE*head = (NODE*)malloc(sizeof(NODE));
  //给head结点申请一个内存
  head->pre = head;
  head->nex = head;
  //head上一个和下一个都指向自己
  int data;
  printf("请输入双链表长度:");
  scanf("%d", &num);
  for (int i = 1; i <= num; ++i)
  {
    printf("第%d个数据:", i);
    scanf("%d", &data);
    //插入函数调用位置
    Add_HData(head, data);
  }
	printf("-----------input data end--------------------------\n");
  //system("pause");

Show_tdata(head);
Sort_the_bubbling(head);
Show_hdata(head);
selection_sort(head);
Show_hdata(head);
	
  return 0;
}

void Add_HData(NODE*head, int data)//插入函数(尾插法)
{
  NODE*p = (NODE*)malloc(sizeof(NODE));
  p->data = data;
  p->nex = head;
  p->pre = head->pre;
  p->nex->pre = p;
  p->pre->nex = p;
}

void Show_hdata(NODE*head)
{
	int i=1;
	NODE*p=(NODE*)malloc(sizeof(NODE));
	p=head->nex;

	while(p!=head)
	{
		printf("%d 个数据:%d\n",i,p->data);
		p=p->nex;
		i++;
	}
	printf("-----------show_hdata end-------------------------\n");
}

void Show_tdata(NODE*head)
{
	int i=num;
	NODE*p=(NODE*)malloc(sizeof(NODE));
	p=head->pre;

	while(p!=head)
	{
		printf("%d 个数据:%d\n",i,p->data);
		p=p->pre;
		i--;
	}
	printf("-----------show_tdata end--------------------------\n");
}


//冒泡排序 降序
void Sort_the_bubbling(NODE*head)
{
  NODE*pi=(NODE*)malloc(sizeof(NODE));
    NODE*pj=(NODE*)malloc(sizeof(NODE));
  int num=0;
  //int flags=0;
  for(pj=head->nex ; pj!=head ; pj=pj->nex)
  {
   // flags=0;
    for(pi=head->nex ; pi->nex!=head ; pi=pi->nex)
    {
      if(pi->data < pi->nex->data)
      {
        num=pi->data;
        pi->data=pi->nex->data;
        pi->nex->data=num;
        //flags=1;
      }
    }
  //  if(!flags)
    //  break;
  }
  printf("-----------Sort_the_bubbling end--------------------------\n");
}

//选择排序 升序
void selection_sort(NODE*head) 
{
  NODE*pi=(NODE*)malloc(sizeof(NODE));
  NODE*pj=(NODE*)malloc(sizeof(NODE));
  NODE*subscript=(NODE*)malloc(sizeof(NODE));
  
  int num=0;
  for( pj=head->nex ; pj!=head  ; pj=pj->nex )
  {
    subscript=pj;
     for ( pi=pj->nex ; pi!= head ; pi = pi->nex )
     {
        if(subscript->data > pi->data)
        {
          subscript=pi;
        }
     }
     if(subscript != pj)
     {
        num = subscript->data;
        subscript->data = pj->data;
        pj->data = num;
     }
  }
printf("-----------selection_sort end--------------------------\n");
}




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双向链表的双向冒泡排序可以通过比较相邻节点的数据域来实现。具体步骤如下: 1. 首先,定义一个指向链表头节点的指针,命名为`current`。 2. 使用两个循环嵌套,外层循环控制比较的轮数,内层循环控制每一轮的比较次数。 3. 在内层循环中,比较`current`节点和`current.next`节点的数据域,如果前者大于后者,则交换它们的数据域。 4. 内层循环结束后,将`current`指针指向下一个节点,继续进行下一轮的比较。 5. 外层循环结束后,整个链表的数据域将按照从小到大的顺序排列。 下面是一个示例代码,演示了双向链表的双向冒泡排序: ```python class Node: def __init__(self, data): self.data = data self.prev = None self.next = None def bubble_sort(head): if head is None or head.next is None: return head end = None while end != head.next: current = head.next while current.next != end: if current.data > current.next.data: current.data, current.next.data = current.next.data, current.data current = current.next end = current return head # 创建双向链表 head = Node(4) node1 = Node(2) node2 = Node(1) node3 = Node(3) head.next = node1 node1.prev = head node1.next = node2 node2.prev = node1 node2.next = node3 node3.prev = node2 # 执行双向冒泡排序 sorted_head = bubble_sort(head) # 输出排序后的链表数据 current = sorted_head.next while current is not None: print(current.data) current = current.next ``` 输出结果为: ``` 1 2 3 4 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值