typedef struct node {//单链表
struct node* next;//指向下一节点的指针
int data;//数据域
}Lnode,*linklist;
bool init(linklist& L) {//单链表的初始化
L = new Lnode;
L->next = NULL;
return true;
}
bool create1(linklist& L, int n) {//前插法创建单链表(正位序)n表示数据个数
Lnode* s = L;//定义一个指针指向头结点
srand((unsigned)time(0) + rand());//为了让随机数随机
for (int i = 0; i < n; i++) {
Lnode* p = new Lnode;//创建一个新节点p
p->data = rand() % 10;//随机数据给这个节点
//cin >> p->data;//输入数据给这个节点
p->next = NULL;//新结点指向空
s->next = p;//尾结点指向新节点p
s = p;//s指针指向尾结点p
}
return true;
}
bool create2(linklist& L, int n) {//后插法建立单链表(逆位序)n表示数据个数
srand((unsigned)time(0) + rand());//为了让随机数随机
for (int i = 0; i < n; i++) {
Lnode* p = new Lnode;//创建一个新节点p
//p->data = rand() % 10;//随机数据给这个节点
cin >> p->data;//输入数据给这个节点
p->next = L->next;//新节点指向第一个数据
L->next = p;//头节点指向新节点
}
return true;
}
bool show(linklist& L) {//单链表的展示
Lnode* s = L->next;//指针s指向第一个数据
while (s) {//然后依次向后遍历,直到为空
cout << s->data;
s = s->next;
}
return true;
}
bool dele(linklist& L, int i) {//单链表第i个位置上的删除
int count = 1;//count用来标记第i位置上的前一个数据,用s指针指向这个数据
Lnode* s = L->next;
if (i == 1) {
L->next = s->next;
}
else {
while (count < i - 1) {
s = s->next;
count++;
}
Lnode* p = s->next;//p指向要删除的数据
s->next = p->next;//要删除数据的前一个数据指针指向删除数据的后一个数据
delete p;
}
return true;
}
bool max(linklist& L, int& e) {//求单链表的最大值
Lnode* s = L->next;
int max = 0;
while (s) {
if (max < s->data)
max = s->data;
s = s->next;
}
return true;
}
bool delsection(linklist& L) {//单链表某递增区间值的删除
int mink = 0, maxk = 0;//左值和右值
Lnode* p = L;//用两个相邻指针来进行删除操作
Lnode* s = L->next;
cin >> mink >> maxk;
while (s) {
if (s->data >= mink && s->data <= maxk) {//如果大于左值且小于右值则删除
p->next = s->next;
s = s->next;
}
else {//否则指针向后移一位
p = s;
s = s->next;
}
}
return true;
}
bool insert(linklist& L, int i, int e) {//单链表第i个位置的插入
Lnode* p = L;
if (i == 1) {//如果插入的是第一位置
Lnode* s = new Lnode;
s->data = e;
s->next = p->next;
p->next = s;
}
else {
while (i>1) {
p = p->next;
i--;
}
Lnode* s = new Lnode;
s->data = e;
s->next = p->next;
p->next = s;
}
return true;
}
bool reverse(linklist& L) {//单链表的逆置
Lnode* p = L->next, * q;//p指向单链表的第一个数据,p用来遍历,q用来插入空表
L->next = NULL;//将表置空
while (p) {
q = p;//q指向p的位置
p = p->next;//p指向下一个位置
q->next = L->next;//将q用头插法插入到空表中
L->next = q;
}
return true;
}
int main()
{
linklist L;
int e = 0;
init(L);
create1(L, 5);
//create2(L, 6);
show(L);
//delsection(L);
//insert(L, 5, 5);
cout << endl;
//dele(L, 3);
//max(L, e);
reverse(L);
show(L);
}