c/c++ 链表功能的实现 [和弦]
今天关注的主题是链表的相关操作,这里使用链表(单向)主要解决动态存储数据体列表的问题。
直接贴代码先:
se.h
#ifndef LIBTEST_SE_H
#define LIBTEST_SE_H
#include <stdio.h>
class seTest{
public:
struct Elist{
int eid;
Elist *next;
};
};
#endif;
main.cpp
1
/*
2
功能描述: c/c++ 链表的实现测试
3
创建时间: 2009-04-16
4
5
*/
6
7
#include "stdafx.h"
8
#include "iostream"
9
#include "se.h"
10
using namespace std;
11
12
void InsertEndList(seTest::Elist *head, seTest::Elist *elist);
13
seTest::Elist* InsertSortList(seTest::Elist *head, seTest::Elist *elist);
14
seTest::Elist* DeleteFromList(seTest::Elist *head, int id);
15
void Print(seTest::Elist *head);
16
17
void main()
18
{
19
seTest::Elist *elist;
20
elist=(seTest::Elist*)malloc(sizeof(seTest::Elist));
21
elist->eid=2;
22
elist->next =NULL;
23
24
seTest::Elist *oneptr_1;
25
oneptr_1=(seTest::Elist*)malloc(sizeof(seTest::Elist));
26
oneptr_1->eid=1;
27
oneptr_1->next=NULL;
28
//InsertEndList(elist, oneptr_1); //将节点插到链表尾部
29
elist = InsertSortList(elist, oneptr_1); //按顺序插入节点
30
31
seTest::Elist *oneptr_2;
32
oneptr_2=(seTest::Elist*)malloc(sizeof(seTest::Elist));
33
oneptr_2->eid=3;
34
oneptr_2->next=NULL;
35
//InsertEndList(elist, oneptr_2); //将节点插到链表尾部
36
elist = InsertSortList(elist, oneptr_2); //按顺序插入节点
37
38
//通过ID删除链表中元素
39
elist = DeleteFromList(elist,2);
40
41
//输出链表数据
42
Print(elist);
43
cin.get();
44
}
45
46
//将数据插入链表中(直接插入到链表尾部)
47
void InsertEndList(seTest::Elist *head, seTest::Elist *elist)
48
{
49
seTest::Elist *p;
50
if(head==NULL)
51
{
52
head = elist;
53
}
54
else
55
{
56
p = head;
57
while(true)
58
{
59
p->eid;
60
if(p->next==NULL)
61
{
62
p->next = elist;
63
p = p->next;
64
break;
65
}
66
else
67
{
68
p = p->next;
69
}
70
}
71
}
72
}
73
74
//将数据插入链表中(排序链表)
75
seTest::Elist* InsertSortList(seTest::Elist *head, seTest::Elist *elist)
76
{
77
seTest::Elist *p,*fp; //*p:当前节点指针 *fp:上一个节点指针
78
if(head==NULL)
79
{
80
head = elist;
81
}
82
else
83
{
84
//待插入节点值比头节点值小,直接插入到链表前面
85
if(elist->eid < head->eid)
86
{
87
elist->next = head;
88
head = elist;
89
}
90
else
91
{
92
fp = head;
93
p = head->next;
94
while(true)
95
{
96
if(p==NULL)
97
{
98
fp->next = elist;
99
break;
100
}
101
else
102
{
103
//如果链表当前节点的值大于或等于要插入节点的值
104
if(p->eid>=elist->eid)
105
{
106
fp->next = elist;
107
elist->next = p;
108
break;
109
}
110
fp = p;
111
p = p->next;
112
}
113
}
114
}
115
}
116
return head;
117
}
118
119
//根据ID值在链表中删除对应的节点
120
seTest::Elist* DeleteFromList(seTest::Elist *head, int id)
121
{
122
seTest::Elist *p,*fp; //*p:当前节点指针 *fp:上一个节点指针
123
if(head==NULL)
124
{
125
cout<<"链表为空"<<endl;
126
}
127
else
128
{
129
fp = head;
130
p = head->next;
131
//如果ID值等于头节点值,则删除头结点
132
if(head->eid == id)
133
{
134
head = head->next;
135
//释放内存
136
free(fp);
137
}
138
else
139
{
140
while(true)
141
{
142
if(p!=NULL && p->eid==id)
143
{
144
fp->next = p->next;
145
free(p);
146
break;
147
}
148
else
149
{
150
if(p==NULL)
151
{
152
cout<<"对不起,链表没有该元素"<<endl;
153
break;
154
}
155
fp = p;
156
p = p->next;
157
}
158
}
159
}
160
}
161
return head;
162
}
163
164
//输出链表数据
165
void Print(seTest::Elist *head)
166
{
167
seTest::Elist *p;
168
p = head;
169
while(p!=NULL)
170
{
171
cout<<p->eid<<endl;
172
if(p->next!=NULL)
173
{
174
p = p->next;
175
}
176
else
177
break;
178
}
179
}

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

174

175

176

177

178

179

以上代码主要用来学习链表测试,实际使用中我们可能还是需要写的更细致点,过滤更严格点。