在书上载录下面的代码,进行学习。 #include <studio.h> /*头文件*/ /*自定义数据类型 NODE, 用于表示每一个待排序的数据*/ typedef struct node { int data; struct node *next; //下一个节点的指针 struct node *prev; //上一个节点的指针 } NODE; /*插入新节点node至双向链表 head中*/ insertLt(NODE *head, NODE *node) { /*链表为空,以要插入的节点为头节点*/ if (*head == NULL) /*第一个节点*/ { (*head) = node; /*以新节点为链表头*/ (*head)->next = NULL; /*后续节点为空*/ (*head)->pre = NULL; /*前序节点为空*/ } else { /*链表非空,将新加入的节点作为头节点,插入链表的头部*/ node->next = *head; /*新节点插入链表的头部*/ (*head)->pre = node; (*head) = node; (*head)->pre = NULL; } } /*一趟冒泡排序的函数,从链表的第一个节点开始比较,直到node节点结束*/ PerBubble(NODE *head, NODE *node) { NODE *tmp, *p; //临时变量定义 int n; for (tmp = head; tmp != node; tmp=tmp->next) //从第一个节点开始比较,到节点结束 { if (tmp->next == NULL) break; /*如果当前值大于后续节点的值,交换两个节点*/ if (tmp->data > tmp->next->data) { n = tmp->data; tmp->data = tmp->next->data; tmp->next->data = n; } } } /*冒泡排序算法函数 head为待排序的链表*/ BubbleSort(NODE *head) { NODE *tmp = NULL for (tmp = head; tmp->next != NULL; ) //查找双向链表的最后一个节点 tmp = tmp->next; /*从最后一个节点开始,一直到第一个元素,分别进行一趟排序过程*/ for (; tmp != NULL; tmp = tmp->pre) { PerBubble(head, tmp); //调用排序函数 } } main() { int n; /*循环变量定义*/ NODE *head = NULL; /*链表的头指针,初始化为空*/ NODE *tmp, *p; /*指针变量,临时保存NODE变量的指针*/ for(;;;) /*循环调用从键盘输入的数据,根据输入的数据简历双向链表,输入负数则退出循环*/ { scanf("%d", &n); //从标准输入设备输入一个整数 if (n < 0) break; tmp = (NODE *)malloc(sizeof(NODE)); //动态申请内存 memset(tmp, 0x00, sizeof(tmp)); //清空申请的内存 tmp->data = n; //保存输入的值 tmp->next = NULL; tmp->pre = NULL; insertLt(&head; tmp); } BubbleSort(head); for (tmp = head; tmp != NULL; ;) //循环输出排序后的结果,同时释放动态申请的内存变量 { printf("%d/n", tmp->data); p = tmp; tmp = tmp->next; //跳转至下一结点 p->next = NULL; free(p); //释放内存 } }