link.h:
对线性表的各种操作函数
1#include"iostream.h"
2//1.初始化单链表
3void InitList(LNode *&HL)
4{
5 HL=NULL;//将单链表置空
6}
7//2.删除单链表中的所有结点,使之成为一个空表
8void ClearList(LNode *&HL)
9{
10 LNode *cp,*np;
11 cp=HL;//表头指针赋给cp
12 while(cp!=NULL)//遍历单链表,向系统交回每一个结点
13 {
14 np=cp->next;//保存下一个结点的指针
15 delete cp;//删除当前结点
16 cp=np;//使下一个结点成为当前结点
17 }
18 HL=NULL;//置单链表为空
19}
20//3.得到单链表的长度
21int 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.检查单链表是否为空
33int ListEmpty(LNode *HL)
34{
35 return (HL==NULL);
36}
37//5.得到单链表中第pos个结点中的元素
38ElemType 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 else
55 {
56 cerr<<"pos is outrange!"<<endl;
57 exit(1);
58 }
59}
60//6.遍历一个单链表
61void 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.向单链表的末尾添加一个元素
72void 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 else
86 {
87 LNode *p=HL;
88 while(p->next!=NULL)
89 p=p->next;
90 p->next=newptr;
91 }
92}
93int 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 else
108 {
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}
1#include"iostream.h"
2//1.初始化单链表
3void InitList(LNode *&HL)
4{
5 HL=NULL;//将单链表置空
6}
7//2.删除单链表中的所有结点,使之成为一个空表
8void ClearList(LNode *&HL)
9{
10 LNode *cp,*np;
11 cp=HL;//表头指针赋给cp
12 while(cp!=NULL)//遍历单链表,向系统交回每一个结点
13 {
14 np=cp->next;//保存下一个结点的指针
15 delete cp;//删除当前结点
16 cp=np;//使下一个结点成为当前结点
17 }
18 HL=NULL;//置单链表为空
19}
20//3.得到单链表的长度
21int 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.检查单链表是否为空
33int ListEmpty(LNode *HL)
34{
35 return (HL==NULL);
36}
37//5.得到单链表中第pos个结点中的元素
38ElemType 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 else
55 {
56 cerr<<"pos is outrange!"<<endl;
57 exit(1);
58 }
59}
60//6.遍历一个单链表
61void 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.向单链表的末尾添加一个元素
72void 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 else
86 {
87 LNode *p=HL;
88 while(p->next!=NULL)
89 p=p->next;
90 p->next=newptr;
91 }
92}
93int 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 else
108 {
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:
Simple_Application
1#include"iostream.h"
2#include"stdlib.h"
3typedef int ElemType;
4struct LNode
5{
6 ElemType data;
7 LNode *next;
8};
9
10#include"link.h"
11
12void 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/**//*
461 7 4 0 9 4 8 8 2 4 5 5 1 7 1 1 5 2 7 6
47输一个0~9之间的一个整数:1
48Deleted element is not exist!
497 4 0 9 4 8 8 2 4 5 5 7 5 2 7 6
5016
51Press any key to continue
52*/
1#include"iostream.h"
2#include"stdlib.h"
3typedef int ElemType;
4struct LNode
5{
6 ElemType data;
7 LNode *next;
8};
9
10#include"link.h"
11
12void 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/**//*
461 7 4 0 9 4 8 8 2 4 5 5 1 7 1 1 5 2 7 6
47输一个0~9之间的一个整数:1
48Deleted element is not exist!
497 4 0 9 4 8 8 2 4 5 5 7 5 2 7 6
5016
51Press any key to continue
52*/