-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLList.c
80 lines (75 loc) · 1.89 KB
/
LList.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//
// Created by Hikaze on 2021/9/27 15:43.
//
//
#include "LList.h"
LList ListInit(){
LList rtn;
rtn.pHead = 0;
return rtn;
}
void ListAppend(LList* pList, void* pData){ //表尾添加元素
//空表直接在表头指针分配新节点空间并返回
if(!pList->pHead){
pList->pHead = (LNode*) calloc(1, sizeof (LNode));
pList->pHead->pData = pData;
return;
}
LNode * p = pList->pHead;
//移动游标到队尾
while(p->pNext){
p = p->pNext;
}
p->pNext = (LNode*) calloc(1, sizeof (LNode));
p->pNext->pData = pData;
}
void* ListRemove(LList* pList, size_t index){ //删除索引指向的元素
void * pRtn = 0;
//若列表为空,返回空指针
if(!pList->pHead){
return pRtn;
}
LNode * p = pList->pHead;
LNode * q = p;
//定位至索引指向处
for(size_t i = 0; i < index;i++){
if(p->pNext){
q = p;
p = p->pNext;
}else{
exit(-1);
}
}
//若删除表头元素
if(q == p){
pList->pHead = p->pNext;
pRtn = p->pData;
free(p);
//若删除其他元素
}else{
//判断是否为删除表尾元素
q->pNext = p->pNext?p->pNext:0;
pRtn = p->pData;
free(p);
}
return pRtn;
}
size_t ListFindMin(LList list, char(*compareCallback)(void*, void*)){ //传入比较数据项回调函数,将比较功能委托给用户代码
if(!list.pHead) {
return 0;
}
LNode* p = list.pHead;
LNode* q = p;
size_t index = 0;
//一次遍历寻找数据项最小的元素
//调用比较函数次数最多为表长
//最差对比表长次,交换表长次节点
for(size_t i = 1;p->pNext;i++){
p = p->pNext;
if(compareCallback(q->pData, p->pData)){
q = p;
index = i;
}
}
return index;
}