单链表实现冒泡排序

来源:互联网 发布:车铣复合加工编程书 编辑:程序博客网 时间:2024/06/01 09:25

单链表实现冒泡排序

/************************************************************************//* 用单链表实现冒泡排序,输入为0-9的数字字符                               *//************************************************************************/#include <stdio.h>#include <stdlib.h>#define PR  printf //定义一个单链表结构体typedef struct node{   long data;   struct node * next;}lklist;//快速排序,小的数据往前排,后的数据往后排lklist* sort(lklist * head){if (head == NULL)return NULL;lklist* p = head->next;lklist* p_pre = p;bool flag = false;   //用于标记是否有交换,当数组有序的时候,提高判断效率while(p_pre->next != NULL){long temp = p_pre->data;p = p->next;while (p){    if(temp <= (p->data)){p = p->next;continue;}else{long temp_change;temp_change = p->data;p->data = p_pre->data;p_pre->data = temp_change;p = p->next;flag = true;}if (flag == false){return head;}}p_pre = p_pre->next;p = p_pre;}return head;}//向含有一个头节点的单链表中插入数据lklist* create_lklist(lklist *head){PR("please input the number of the data and end with q(Q):\n");while(1){char ch[2];scanf("%s",ch);if(ch[0] == 'q' || ch[0] == 'Q')  //输入为q(Q)时停止输入break;else{long intData = strtol(ch,0,10);lklist* temp = NULL;temp = (lklist*)malloc(sizeof(struct node));temp->data = intData;temp->next = NULL;    temp->next = head->next;head->next = temp;}}return head;} //打印单链表中的数据信息void printf_lklist(lklist* head){if (NULL == head){return;}lklist * p = head->next;PR("the sorted number is:\n");while (p){PR("%d  ",p->data);p = p->next;}PR("\n");}//释放有数据的链表中的节点void free_lklist(lklist* head){if (NULL == head){return;}lklist * p = head->next;lklist *pre;while (p){pre = p;p = p->next;free(pre);}}void main(){   lklist *head = (struct node *)malloc(sizeof(struct node));head->next = NULL;  //头节点不存放数据    head = create_lklist(head);head = sort(head);printf_lklist(head);free_lklist(head);free(head); //释放申请的头节点}



原创粉丝点击