1 #include<iostream>
2 #include<string>
3 #include<iomanip>
4 #include<stdlib.h>
5 using namespace std;
6
7 typedef struct LNode {
8 int data; //结点的数据域
9 struct LNode *next; //结点的指针域
10 }LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
11
12 bool InitList_L(LinkList &L)//构造一个空的单链表L
13 {
14 L=new LNode; //生成新结点作为头结点,用头指针L指向头结点
15 if(!L)
16 return false; //生成结点失败
17 L->next=NULL; //头结点的指针域置空
18 return true;
19 }
20
21 void CreateList_H(LinkList &L)//前插法创建单链表
22 {
23 //输入n个元素的值,建立到头结点的单链表L
24 int n;
25 LinkList s; //定义一个指针变量
26 L=new LNode;
27 L->next=NULL; //先建立一个带头结点的空链表
28 cout <<"请输入元素个数n:" <<endl;
29 cin>>n;
30 cout <<"请依次输入n个元素:" <<endl;
31 cout <<"前插法创建单链表..." <<endl;
32 while(n--)
33 {
34 s=new LNode; //生成新结点s
35 cin>>s->data; //输入元素值赋给新结点的数据域
36 s->next=L->next;
37 L->next=s; //将新结点s插入到头结点之后
38 }
39 }
40
41 void CreateList_R(LinkList &L)//尾插法创建单链表
42 {
43 //输入n个元素的值,建立带表头结点的单链表L
44 int n;
45 LinkList s, r;
46 L=new LNode;
47 L->next=NULL; //先建立一个带头结点的空链表
48 r=L; //尾指针r指向头结点
49 cout <<"请输入元素个数n:" <<endl;
50 cin>>n;
51 cout <<"请依次输入n个元素:" <<endl;
52 cout <<"尾插法创建单链表..." <<endl;
53 while(n--)
54 {
55 s=new LNode;//生成新结点
56 cin>>s->data; //输入元素值赋给新结点的数据域
57 s->next=NULL;//因为是尾插法,可能是最后一个节点,所以要置空
58 r->next=s;//将新结点s插入尾结点*r之后
59 r=s;//重新更新尾指针,r指向新的尾结点s
60 }
61 }
62
63 bool GetElem_L(LinkList L, int i, int &e)//单链表的取值
64 {
65 //在带头结点的单链表L中查找第i个元素
66 //用e记录L中第i个数据元素的值
67 int j;
68 LinkList p;
69 p=L->next;//p指向第一个结点,
70 j=1; //j为计数器
71 while (j<i && p) //顺链域向后扫描,直到p指向第i个元素或p为空
72 {
73 p=p->next; //p指向下一个结点
74 j++; //计数器j相应加1
75 }
76 if (!p || j>i)
77 return false; //i值不合法i>n或i<=0
78 e=p->data; //取第i个结点的数据域
79 return true;
80 }
81
82 bool LocateElem_L(LinkList L, int e) //按值查找
83 {
84 //在带头结点的单链表L中查找值为e的元素
85 LinkList p;
86 p=L->next;
87 while (p && p->data!=e)//顺链域向后扫描,直到p为空或p所指结点的数据域等于e
88 p=p->next; //p指向下一个结点
89 if(!p)
90 return false; //查找失败p为NULL
91 return true;
92 }
93
94 bool ListInsert_L(LinkList &L, int i, int e)//单链表的插入
95 {
96 //在带头结点的单链表L中第i个位置插入值为e的新结点
97 int j;
98 LinkList p, s;
99 p=L;
100 j=0;
101 while (p&&j<i-1) //查找第i-1个结点,p指向该结点
102 {
103 p=p->next;
104 j++;
105 }
106 if (!p || j>i-1)//i>n+1或者i<1
107 return false;
108 s=new LNode; //生成新结点
109 s->data=e; //将新结点的数据域置为e
110 s->next=p->next; //将新结点的指针域指向结点ai
111 p->next=s; //将结点p的指针域指向结点s
112 return true;
113 }
114
115 bool ListDelete_L(LinkList &L, int i) //单链表的删除
116 {
117 //在带头结点的单链表L中,删除第i个位置
118 LinkList p, q;
119 int j;
120 p=L;
121 j=0;
122 while((p->next)&&(j<i-1)) //查找第i-1个结点,p指向该结点
123 {
124 p=p->next;
125 j++;
126 }
127 if (!(p->next)||(j>i-1))//当i>n或i<1时,删除位置不合理
128 return false;
129 q=p->next; //临时保存被删结点的地址以备释放空间
130 p->next=q->next; //改变删除结点前驱结点的指针域
131 delete q; //释放被删除结点的空间
132 return true;
133 }
134
135 void Listprint_L(LinkList L) //单链表的输出
136 {
137 LinkList p;
138 p=L->next;
139 while (p)
140 {
141 cout<<p->data<<"\t";
142 p=p->next;
143 }
144 cout<<endl;
145 }
146
147 int main()
148 {
149 int i,x,e,choose;
150 LinkList L;
151 cout << "1. 初始化\n";
152 cout << "2. 创建单链表(前插法)\n";
153 cout << "3. 创建单链表(尾插法)\n";
154 cout << "4. 取值\n";
155 cout << "5. 查找\n";
156 cout << "6. 插入\n";
157 cout << "7. 删除\n";
158 cout << "8. 输出\n";
159 cout << "0. 退出\n";
160 choose=-1;
161 while (choose!=0)
162 {
163 cout<<"请输入数字选择:";
164 cin>>choose;
165 switch (choose)
166 {
167 case 1: //初始化一个空的单链表
168 if (InitList_L(L))
169 cout << "初始化一个空的单链表!\n";
170 break;
171 case 2: //创建单链表(前插法)
172 CreateList_H(L);
173 cout << "前插法创建单链表输出结果:\n";
174 Listprint_L(L);
175 break;
176 case 3: //创建单链表(尾插法)
177 CreateList_R(L);
178 cout << "尾插法创建单链表输出结果:\n";
179 Listprint_L(L);
180 break;
181 case 4: //单链表的按序号取值
182 cout << "请输入一个位置i用来取值:";
183 cin >> i;
184 if (GetElem_L(L,i,e))
185 {
186 cout << "查找成功\n";
187 cout << "第" << i << "个元素是:"<<e<< endl;
188 }
189 else
190 cout << "查找失败\n\n";
191 break;
192 case 5: //单链表的按值查找
193 cout<<"请输入所要查找元素x:";
194 cin>>x;
195 if (LocateElem_L(L,x))
196 cout << "查找成功\n";
197 else
198 cout << "查找失败! " <<endl;
199 break;
200 case 6: //单链表的插入
201 cout << "请输入插入的位置和元素(用空格隔开):";
202 cin >> i;
203 cin >> x;
204 if (ListInsert_L(L, i, x))
205 cout << "插入成功.\n\n";
206 else
207 cout << "插入失败!\n\n";
208 break;
209 case 7: //单链表的删除
210 cout<<"请输入所要删除的元素位置i:";
211 cin>>i;
212 if (ListDelete_L(L, i))
213 cout<<"删除成功!\n";
214 else
215 cout<<"删除失败!\n";
216 break;
217 case 8: //单链表的输出
218 cout << "当前单链表的数据元素分别为:\n";
219 Listprint_L(L);
220 cout << endl;
221 break;
222 }
223 }
224 return 0;
225 }
//合并链表
#include<iostream>
#include<string>
using namespace std;
typedef struct LNode {
int data; //结点的数据域
struct LNode *next; //结点的指针域
}LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
void CreateList_R(LinkList &L)//尾插法创建单链表
{
//输入n个元素的值,建立带表头结点的单链表L
int n;
LinkList s, r;
L=new LNode;
L->next=NULL; //先建立一个带头结点的空链表
r=L; //尾指针r指向头结点
cout <<"请输入元素个数n:" <<endl;
cin>>n;
cout <<"请依次输入n个整型数(非递减):" <<endl;
cout <<"尾插法创建单链表..." <<endl;
while(n--)
{
s=new LNode;//生成新结点
cin>>s->data; //输入元素值赋给新结点的数据域
s->next=NULL;
r->next=s;//将新结点s插入尾结点r之后
r=s;//r指向新的尾结点s
}
}
void mergelinklist(LinkList La, LinkList Lb, LinkList &Lc)
{
LinkList p,q,r;
p=La->next; //p指向La的第一个元素
q=Lb->next; //q指向Lb的第一个元素
Lc=La; //Lc指向La的头结点;LC为新生成的链表头结点指针
r=Lc; //r指向Lc的尾部
while(p&&q)//pq都为真的时候才可以比较
{
if(p->data<=q->data)//把p指向的结点串起来
{
r->next=p;
r=p;
p=p->next;//p后移一个结点
}
else //把q指向的结点串起来
{
r->next=q;
r=q;
q=q->next;
}
}
r->next=p?p:q;//相当于if(p) r->next=p; else r->next=q;
delete Lb;
}
void Listprint_L(LinkList L) //单链表的输出
{
LinkList p;
p=L->next;
while (p)
{
cout<<p->data<<"\t";
p=p->next;
}
cout<<endl;
}
int main()
{
LinkList La,Lb,Lc;
cout << "创建有序(非递减)单链表La:"<<endl;
CreateList_R(La);
cout << "创建有序(非递减)单链表Lb:"<<endl;
CreateList_R(Lb);
cout << "将两个有序(非递减)单链表La和Lb合并为Lc:"<<endl;
mergelinklist(La,Lb,Lc);
cout << "合并后的结果Lc:"<<endl;
Listprint_L(Lc);
return 0;
}
//快慢指针找中间数
#include<iostream>
#include<string>
using namespace std;
typedef struct LNode {
int data; //结点的数据域
struct LNode *next; //结点的指针域
}LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
void CreateList_R(LinkList &L)//尾插法创建单链表
{
//输入n个元素的值,建立带表头结点的单链表L
int n;
LinkList s, r;
L=new LNode;
L->next=NULL; //先建立一个带头结点的空链表
r=L; //尾指针r指向头结点
cout <<"请输入元素个数n:" <<endl;
cin>>n;
cout <<"尾插法(正序)创建单链表..." <<endl;
while(n--)
{
s=new LNode;//生成新结点
cin>>s->data; //输入元素值赋给新结点的数据域
s->next=NULL;
r->next=s;//将新结点s插入尾结点r之后
r=s;//r指向新的尾结点s
}
}
LinkList findmiddle(LinkList L)
{
LinkList p,q;
p=L; //p为快指针,初始时指向L
q=L; //q为慢指针,初始时指向L
while(p!=NULL&&p->next!=NULL)
{
p=p->next->next;//p为快指针一次走两步;
q=q->next; //q为慢指针一次走一步
}
return q;//返回中间结点指针
}
void Listprint_L(LinkList L) //单链表的输出
{
LinkList p;
p=L->next;
while (p)
{
cout<<p->data<<"\t";
p=p->next;
}
cout<<endl;
}
int main()
{
LinkList L,mid;
cout<<"创建单链表L:"<<endl;
CreateList_R(L);
cout<<"单链表数据为:"<<endl;
Listprint_L(L);
mid=findmiddle(L);
cout<<"单链表中间结点数据为:"<<mid->data<<endl;
return 0;
}