无头链表有序插入
#include <stdio.h>
#include <stdlib.h>
typedef struct list {
int num;
struct list *pNext;
}Node,*pNode;
//有序插入
void listInsertSort(pNode * pHead, pNode* pTail, int value) {
pNode pNew = (pNode)calloc(1, sizeof(Node));//申请空间,自带memset
pNode pCur = *pHead, pPre = *pHead;//初始化
pNew->num = value;
if (NULL == *pHead) { //判断链表是否为空
*pHead = pNew;
*pTail = pNew;
}
else if (pCur->num > value) { //判断第一个节点的值是否大于插入的值,然后用头插法
pNew->pNext = *pHead;
*pHead = pNew;
}
else {
while (pCur) { //否则遍历链表
if (pCur->num > value) {
pPre->pNext = pNew;
pNew->pNext = pCur;
break;
}
pPre = pCur;
pCur = pCur->pNext;
}
if (NULL==pCur) { //要插入的值最大,尾插法
pPre->pNext = pNew;
*pTail = pNew;
}
}
}
//打印链表
void printlist(pNode pHead) {
while (pHead) {
printf("%3d", pHead->num);
pHead = pHead->pNext;
}
printf("\n");
}
int main() {
pNode pHead = NULL, pTail = NULL;
int num;
while (scanf("%d", &num) != EOF) {
listInsertSort(&pHead, &pTail, num);
}
printlist(pHead);
return 0;
}
关于函数形参的指针问题见 一级指针与二级指针简单理解
源代码来源于B站王道论坛