2. 线性表之应用(单链表结构)
link.h:
1
#include"iostream.h"2
//1.初始化单链表3
void InitList(LNode *&HL)4


{5
HL=NULL;//将单链表置空6
}7
//2.删除单链表中的所有结点,使之成为一个空表8
void ClearList(LNode *&HL)9


{10
LNode *cp,*np;11
cp=HL;//表头指针赋给cp12
while(cp!=NULL)//遍历单链表,向系统交回每一个结点13

{14
np=cp->next;//保存下一个结点的指针15
delete cp;//删除当前结点16
cp=np;//使下一个结点成为当前结点17
}18
HL=NULL;//置单链表为空19
}20
//3.得到单链表的长度21
int ListSize(LNode *&HL)22


{23
LNode *p=HL;24
int i=0;//用来统计结点的个数25
while(p!=NULL)26

{27
i++;28
p=p->next;29
}30
return i;31
}32
//4.检查单链表是否为空33
int ListEmpty(LNode *HL)34


{35
return (HL==NULL);36
}37
//5.得到单链表中第pos个结点中的元素38
ElemType GetElem(LNode *HL,int pos)39


{40
if(pos<1)41

{42
cerr<<"pos is out range!"<<endl;43
exit(1);44
}45
LNode *p=HL;46
int i=0;47
while(p!=NULL)48

{49
i++;50
if(i==pos) break;51
p=p->next;52
}53
if(p!=NULL) return p->data;54
else55

{56
cerr<<"pos is outrange!"<<endl;57
exit(1);58
}59
}60
//6.遍历一个单链表61
void TraverseList(LNode *&HL)62


{63
LNode *p=HL;64
while(p!=NULL)65

{66
cout<<p->data<<" ";67
p=p->next;68
}69
cout<<endl;70
}71
//9.向单链表的末尾添加一个元素72
void InsertRear(LNode *&HL,const ElemType &item)73


{74
LNode *newptr;75
newptr=new LNode;//为保存新元素分配动态结点,指向这个结点76
if(newptr==NULL)//若未分配到结点,则停止插入退出程序运行77

{78
cerr<<"Memory allocation failare!"<<endl;79
exit(1);80
}81
newptr->data=item;82
newptr->next=NULL;83
if(HL==NULL)84
HL=newptr;85
else86

{87
LNode *p=HL;88
while(p->next!=NULL)89
p=p->next;90
p->next=newptr;91
}92
}93
int Delete(LNode* &HL,const ElemType &item)94


{95
//若单链表为空,则返回为假96
if(HL==NULL)97

{98
cerr<<"HL is NULL"<<endl;99
return 0;100
}101
//从单链表中顺序查找与给定值相等的第一个元素,直到查找成功或失败为止102
LNode* ap,*cp;103
ap=NULL;cp=HL;104
while(cp!=NULL)105
if(cp->data==item)106
break;107
else108

{109
ap=cp;110
cp=cp->next;111
}112
//如果查找失败则返回假113
if(cp==NULL)114

{115
cerr<<"Deleted element is not exist!"<<endl;116
return 0;117
}118
//删除查找到的结点,对表头结点和非表头结点要做不同处理119
if(ap==NULL) //由cp指向的被删除的结点是表头结点120
HL=HL->next;121
else //由cp指向的被删除的结点是非表头结点122
ap->next=cp->next;123
//回收被删除的结点124
delete cp;125
//返回真表明删除成功126
return 1;127
}Simple_Application.cpp:
1
#include"iostream.h"2
#include"stdlib.h"3
typedef int ElemType;4
struct LNode5


{6
ElemType data;7
LNode *next;8
};9

10
#include"link.h"11

12
void main()13


{14
//构成单链表15
LNode *head;16
InitList(head);17
int i,j;18
for(i=0;i<20;i++)19

{20
j=rand()%10;21
InsertRear(head,j);22
}23
//输出遍历单链表24
TraverseList(head);25
//从单链表中删除与键盘上输入的值相等的所有结点26
cout<<"输一个0~9之间的一个整数:";27
cin>>j;28
while(Delete(head,j))29

{}30
//输出遍历单链表31
TraverseList(head);32
//输出单链表的长度33
cout<<ListSize(head)<<endl;34

35
//-----------------------------------------------36
cout<<"********************************"<<endl;37
int flag=1;38
while(flag)39

{40
cout<<"退出:0 | 循环:非0"<<endl;41
cout<<"请选择:";42
cin>>flag;43
}44
}45

/**//*46
1 7 4 0 9 4 8 8 2 4 5 5 1 7 1 1 5 2 7 647
输一个0~9之间的一个整数:148
Deleted element is not exist!49
7 4 0 9 4 8 8 2 4 5 5 7 5 2 7 650
1651
Press any key to continue52
*/
浙公网安备 33010602011771号