单链表 冒泡排序

https://github.com/chenyufeng1991/BubbleSortLinkedList_HeadNode/blob/master/BubbleSortLinkedList_HeadNode/main.c

//
  // main.c
  // BubbleSortLinkedList_HeadNode
  //
  // Created by chenyufeng on 16/3/1.
  // Copyright © 2016年 chenyufengweb. All rights reserved.
  //
   
  /**
  * 对带头结点的单链表进行冒泡排序,并打印
  */
   
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
   
  typedef int elemType;
  typedef struct NodeList{
   
  int element;
  struct NodeList *next;
  }Node;
   
  //初始化带头结点的单链表
  void InitialList(Node **pNode){
   
  //个人建议每一次malloc分配内存空间后,都要进行判断分配是否成功,也即判断是否为空;
  //此时的这个pNode就是一个头结点;
  //初始化成功后,其实相当于是一个正常的链表了;
  *pNode = (Node *)malloc(sizeof(Node));
  if (*pNode == NULL) {
  printf("%s函数执行,内存分配失败,初始化单链表失败",__FUNCTION__);
  }else{
   
  (*pNode)->next = NULL;
  printf("%s函数执行,带头结点的单链表初始化完成\n",__FUNCTION__);
  }
  }
   
  //创建带头结点的单链表(尾插法)
  void CreateListTailInsert(Node *pNode){
   
  /**
  * 就算一开始输入的数字小于等于0,带头结点的单链表都是会创建成功的,只是这个单链表为空而已,也就是里面除了头结点就没有其他节点了。
  */
  Node *pInsert;
  Node *pMove;
  pInsert = (Node *)malloc(sizeof(Node));//需要检测分配内存是否成功 pInsert == NULL ?
  memset(pInsert, 0, sizeof(Node));
  pInsert->next = NULL;
   
  scanf("%d",&(pInsert->element));
  pMove = pNode;
  while (pInsert->element > 0) {
   
  pMove->next = pInsert;
  pMove = pInsert;//pMove始终指向最后一个节点
   
  pInsert = (Node *)malloc(sizeof(Node)); //需要检测分配内存是否成功 pInsert == NULL ?
  memset(pInsert, 0, sizeof(Node));
  pInsert->next = NULL;
   
  scanf("%d",&(pInsert->element));
  }
   
  printf("%s函数执行,带头结点的单链表使用尾插法创建成功\n",__FUNCTION__);
  }
   
  //打印带头结点的单链表
  void PrintList(Node *pNode){
  /**
  * 注意这里,如果单链表为空(只有一个头结点),我也让它打印(打印成功)。只是里面没有元素,打出来是空的而已,所以在控制台上就是一行空的;
  */
  Node *pMove;
  pMove = pNode->next;
  while (pMove != NULL) {
  printf("%d ",pMove->element);
  pMove = pMove->next;
  }
   
  printf("\n%s函数执行,打印带头结点的单链表成功\n",__FUNCTION__);
  }
   
  //返回带头结点的单链表的长度
  int SizeList(Node *pNode){
  /**
  * 当只有一个头结点的时候,size = 0;头节点不计算到链表长度中。
  */
  int i = 0;
  Node *pMove;
  pMove = pNode->next;
  while (pMove != NULL) {
  i++;
  pMove = pMove->next;
  }
   
  printf("%s函数执行,带头结点的单链表的长度为:%d\n",__FUNCTION__,i);
   
  return i;
  }
   
  Node *BubbleSort(Node *pNode){
   
  int count = SizeList(pNode);//用来控制次数
   
  Node *pMove;
  pMove = pNode->next;
   
  while (count > 1) {
  while (pMove->next != NULL) {
  if (pMove->element > pMove->next->element) {
  int temp;
  temp = pMove->element;
  pMove->element = pMove->next->element;
  pMove->next->element = temp;
  }
  pMove = pMove->next;
  }
  count--;
  pMove = pNode->next;
  }
   
  printf("%s函数执行,带头结点的单链表冒泡排序成功\n",__FUNCTION__);
  PrintList(pNode);
   
  return pNode;
  }
   
  int main(int argc, const char * argv[]) {
   
  Node *pList;
   
  InitialList(&pList);
   
  CreateListTailInsert(pList);
  PrintList(pList);
   
  BubbleSort(pList);
   
  return 0;
  }
   
   
   
   
   
   
   
   
   
   
   

猜你喜欢

转载自blog.csdn.net/sinat_35297665/article/details/80286950