之前排序创建链表那里用的是哨兵法,但是有局限性,这里介绍一个补充,不创建第一个空节点进行排序
NODE *create()
{int val;NODE *head = NULL; // 初始化头指针为NULLNODE *pC = NULL; // 初始化指针,用于遍历链表while(1) {printf("Enter a number(-1 to End):");scanf("%d", &val);if(val == -1) {break;}NODE *n = (NODE*)malloc(sizeof(NODE));n->num = val;n->next = NULL;// 如果链表为空或者新节点的值小于头节点的值,则新节点成为新的头节点if(head == NULL || val < head->num) {n->next = head;head = n;} else {pC = head; // 从头节点开始遍历// 找到正确的插入位置while(pC->next != NULL && pC->next->num < val){pC = pC->next;}// 插入节点n->next = pC->next;pC->next = n;}}return head;
}
图解
第一次
NODE *head = NULL; // 初始化头指针为NULLNODE *pC = NULL; // 初始化指针,用于遍历链表
判断head是谁(第一次什么都没有,就让第一个输入的当头)
如果输入一个小的
n->next = head;
n = head;
这块就是这么写
if(head == NULL || val < head->num) {n->next = head;head = n;}
其余情况即输入的比之前的大就尾插(这里原理和上次的几乎一样了),可以参考上次文章,就不多赘述了
主要就是开头有所变化
以上均是本人理解,如有不对欢迎各位大佬评论区指出~