-
Notifications
You must be signed in to change notification settings - Fork 0
/
企业版链表.c
173 lines (139 loc) · 3.08 KB
/
企业版链表.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
//节点结构体设计
struct LinkNode
{
//只维护指针域
struct LinkNode*next;
};
struct LList
{
struct LinkNode pHeader;//头节点
int m_Size;
};
typedef void* LinkList;
//从初始化链表
void init_LinkList()
{
struct LList *mylist=malloc(sizeof(struct LList));
if(mylist==NULL)
return;
mylist->m_Size=0;
mylist->pHeader.next=NULL;
}
//插入链表
void insert_LinkList(LinkList list,int pos,void*data)
{
if(list==NULL)
return;
struct LList*mylist=list;
if(pos<0||pos>mylist->m_Size-1)
{
pos=mylist->m_Size;
}
//取出用户数据的前四个字节空间
struct LinkNode*myNode=data;
//找到的等待插入位置的前驱节点
struct LinkNOde*pCurrent =myNode->pHeader;
for(int i=0;i<pos;i++)
{
pCurrent=pCurrent->next;
}
//更改指针指向
myNode->next=pCurrent->next;
pCurrent->next=myNode;
mylist->m_Size++;
}
//用回调函数年遍历
void foreach_LinkList(LinkList list,void(*myPrint)(void*))
{
if(NULL==list)
return;
struct LList*mylist=list;
//指向第一个有真实数据的节点
struct LinkNode*pCurrent=mylist->pHeader.next;
for(int i=0;i<mylist->m_Size;i++)
{
//pCurrent就是用户数据的首地址,用首地质访问
myPrint(pCurrent);
pCurrent=pCurrent->next;
}
}
struct person
{
struct LinkNode node;
char name[64];
int age;//节点结构体设计
};
struct LinkNode
{
//只维护指针域
struct LinkNode*next;
};
struct LList
{
struct LinkNode pHeader;//头节点
int m_Size;
};
typedef void* LinkList;
//从初始化链表
void init_LinkList()
{
struct LList *mylist=malloc(sizeof(struct LList));
if(mylist==NULL)
return;
mylist->m_Size=0;
mylist->pHeader.next=NULL;
}
//插入链表
void insert_LinkList(LinkList list,int pos,void*data)
{
if(list==NULL)
return;
struct LList*mylist=list;
if(pos<0||pos>mylist->m_Size-1)
{
pos=mylist->m_Size;
}
//取出用户数据的前四个字节空间
struct LinkNode*myNode=data;
//找到的等待插入位置的前驱节点
struct LinkNOde*pCurrent =myNode->pHeader;
for(int i=0;i<pos;i++)
{
pCurrent=pCurrent->next;
}
//更改指针指向
myNode->next=pCurrent->next;
pCurrent->next=myNode;
mylist->m_Size++;
}
//用回调函数年遍历
void foreach_LinkList(LinkList list,void(*myPrint)(void*))
{
if(NULL==list)
return;
struct LList*mylist=list;
//指向第一个有真实数据的节点
struct LinkNode*pCurrent=mylist->pHeader.next;
for(int i=0;i<mylist->m_Size;i++)
{
//pCurrent就是用户数据的首地址,用首地质访问
myPrint(pCurrent);
pCurrent=pCurrent->next;
}
}
struct person
{
struct LinkNode node;
char name[64];
int age;
}
void myprint(void*data)
{
struct person*person=data;
printf("%s %d\n",person->name,person->age);
}
void myprint(void*data)
{
struct person*data1=data;
printf("%s %d\n",data1->name,data1->age);
}