刚开始学的
/*这个程序是用来练习单链表的*/
#include
iostream
#include
stdio.h
#include
ctime
const
int
TRUE
=
1
;
const
int
FALSE
=
;
const
int
MAXSIZE
=
10
;
using
namespace
std
;
//定义链表中存储的数据类型
typedef
int
Elemtype
;
//定义函数返回值的数据类型
typedef
Elemtype
Status
;
//定义单链表结构
typedef
struct
Node
{
Elemtype
data
;
Node
*
next
;
//这个指针指向Node数据类型的存储地址
}
Node
;
//给Node数据类型起名字,可以改成其他名字
typedef
struct
Node
*
LinkList
;
/*定义一个指向链表的指针,这里的链表就是Node节点一个个组成的*/
Status
GetElem
(
LinkList
L
,
int
i
,
Elemtype
*
e
);
/*获取链表中的元素*/
void
ShowList
(
LinkList
L
);
/*展示链表的内容*/
void
CreateListHead
(
LinkList
L
,
int
n
);
//头插法创建单链表
Status
ListInsert
(
LinkList
L
,
int
i
,
Elemtype
e
);
/*用来向链表内插入元素*/
Status
ListDelete
(
LinkList
L
,
int
i
);
/*用来删除链表中指定下表的节点*/
int
main
(
void
){
LinkList
L1
;
CreateListHead
(
L1
,
MAXSIZE
);
ShowList
(
L1
);
cout
"
\n
请输入要读取的元素序号(1-?):
\n
"
;
int
index
;
cin
index
;
Elemtype
*
e
;
e
=(
Elemtype
*)
malloc
(
sizeof
(
Elemtype
));
Status
elem
;
elem
=
GetElem
(
L1
,
index
,
e
);
cout
"结果为:
\n
"
elem
;
cout
"
\n
请输入要插入元素的位置(1-?):
\n
"
;
cin
index
;
cout
"请输入要插入的整数:
\n
"
;
cin
(*
e
);
ListInsert
(
L1
,
index
,(*
e
));
free
(
e
);
ShowList
(
L1
);
cout
"
\n
请输入要删除的节点序号(1-?):
\n
"
;
cin
index
;
ListDelete
(
L1
,
index
);
ShowList
(
L1
);
return
;
}
Status
GetElem
(
LinkList
L
,
int
i
,
Elemtype
*
e
){
LinkList
p
;
//这个指针用来迭代
if
(
i
=
){
cout
"所给序号=0
\n
"
;
return
FALSE
;
}
if
(
L
-
next
==
NULL
){
cout
"链表为空
\n
"
;
return
FALSE
;
}
p
=
L
-
next
;
//让p指向链表的第一个节点
for
(
int
k
=
1
;
k
i
;
k
++)
{
if
(
p
-
next
==
NULL
){
cout
"所给的序号超出链表范围!!
\n
"
;
return
FALSE
;
}
p
=
p
-
next
;
//指向的节点往后移
}
return
p
-
data
;
//返回当前指向的节点数据
}
void
ShowList
(
LinkList
L
){
LinkList
p
;
p
=
L
;
cout
"链表的内容为:
\n
"
;
while
(
p
-
next
!=
NULL
){
cout
p
-
next
-
data
""
;
p
=
p
-
next
;
}
}
void
CreateListHead
(
LinkList
L
,
int
n
){
LinkList
p
;
srand
(
time
(
));
/*初始化随机数种子*/
L
=
new
Node
;
L
-
next
=
NULL
;
/*先建立一个带头结点的单链表*/
for
(
int
i
=
;
i
n
;
i
++)
{
p
=
new
Node
;
/*生成新的节点*/
p
-
data
=
rand
()%
+
1
;
p
-
next
=
L
-
next
;
/*将原有的节点往后移*/
L
-
next
=
p
;
/*插入到表头*/
}
}
Status
ListInsert
(
LinkList
L
,
int
i
,
Elemtype
e
){
if
(
i
=
){
printf
(
"序号超出链表范围"
);
cout
"插入失败!!
\n
"
;
return
FALSE
;
}
LinkList
p
;
p
=
L
;
int
k
=
1
;
LinkList
node
=(
LinkList
)
malloc
(
sizeof
(
Node
));
node
-
data
=
e
;
while
(
p
-
next
!=
NULL
){
if
(
k
=
i
){
break
;
}
p
=
p
-
next
;
//指针向后移动
k
++;
}
if
(
k
=
i
){
//说明要插入到最后一个位置
p
-
next
=
node
;
node
-
next
=
NULL
;
cout
"插入成功
\n
"
;
return
TRUE
;
}
//要插入元素到中间位置
node
-
next
=
p
-
next
-
next
;
p
-
next
=
node
;
cout
"插入成功
\n
"
;
return
TRUE
;
}
Status
ListDelete
(
LinkList
L
,
int
i
){
LinkList
p
,
q
;
p
=
L
;
//让p指针指向链表的头节点
int
k
=
1
;
while
(
p
-
next
!=
NULL
){
if
(
k
=
i
){
break
;
}
p
=
p
-
next
;
//p指针向后移动到要删除节点的上一个节点
k
++;
}
if
(
k
i
){
cout
"输入下标超出链表范围!!!
\n
"
;
return
FALSE
;
}
if
(
p
-
next
-
next
!=
NULL
){
//说明要删除的是中间节点
q
=
p
-
next
;
p
-
next
=
p
-
next
-
next
;
free
(
q
);
cout
"删除成功
\n
"
;
return
TRUE
;
}
//说明要删除的是尾部节点
q
=
p
-
next
;
p
-
next
=
NULL
;
free
(
q
);
//释放删除节点的内存
cout
"删除成功
\n
"
;
return
TRUE
;
}