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
功能描述: c/c++ 链表的实现测试3
创建时间: 2009-04-164

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
else55
{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
else67
{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
else83
{84
//待插入节点值比头节点值小,直接插入到链表前面85
if(elist->eid < head->eid)86
{87
elist->next = head;88
head = elist;89
}90
else91
{92
fp = head;93
p = head->next;94
while(true)95
{96
if(p==NULL)97
{98
fp->next = elist;99
break;100
}101
else102
{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
else128
{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
else139
{140
while(true)141
{142
if(p!=NULL && p->eid==id)143
{144
fp->next = p->next;145
free(p);146
break;147
}148
else149
{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
else177
break;178
}179
}
以上代码主要用来学习链表测试,实际使用中我们可能还是需要写的更细致点,过滤更严格点。


浙公网安备 33010602011771号