#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#define Max 20
typedef struct node
{
int data;
struct node* next;
}linklist;
void Menu()
{
printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
printf("■ MENU ■\n");
printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
printf("■ 1 逆转方案一 ■\n");
printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
printf("■ 2 逆转方案二 ■\n");
printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
printf("■ 3 逆转方案三 ■\n");
printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
printf("■ 4 逆转方案四 ■\n");
printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
printf("■ 5 逆转方案五 ■\n");
printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
printf("■ 6 退出 ■\n");
printf("■■■■■■■■■■■■■■■■■■■■■■■■■\n");
}
void Reverse_01(linklist* head)
{
linklist* p, * pre, * r=NULL;
p = head->next;
pre = NULL;
while (p)
{
r = p->next;
p->next = pre;
pre = p;
p = r;
}
head->next = pre;
}
linklist *Reverse_02(linklist* head,int n)
{
linklist* p, * r=NULL;
static int i=0;
p = head->next;
if ((p==NULL)||(p->next==NULL))
{
return p;
}
else
{
i++;
r = Reverse_02(p, n);
p->next->next = p;
p->next = NULL;
}
i--;
if (i==0)
{
head->next = r;
}
return r;
}
void Reverse_03(linklist*head,int n)
{
linklist* p, * q, * r=NULL;
p = head->next;
q = p->next;
while (--n)
{
if (n!=1)
{
r = q->next;
}
q->next = p;
p = q;
if (n!=1)
{
q = r;
}
}
head->next->next = NULL;
head->next = q;
}
void Reverse_04(linklist *head)
{
linklist *p = NULL;
linklist *q = NULL;
if (head && head->next)
{
p = head->next;
q = p->next;
p->next = NULL;
}
while (q)
{
p = q;
q = q->next;
p->next = head->next;
head->next = p;
}
}
void Reverse_05(linklist *head)
{
linklist* p, * q;
p = head->next;
head->next = NULL;
while (p)
{
q = p;
p = p->next;
q->next = head->next;
head->next = q;
}
}
void CreateList_02(linklist* head, int n)
{
linklist* p, * r; int i;
srand((unsigned)time(NULL));
p = head;
for (i = 1; i <= n; i++)
{
r = (linklist*)malloc(sizeof(linklist));
r->data = rand() % 100 + 1;
p->next = r;
p = r;
}
r->next = NULL;
}
void Out(linklist* head)
{
linklist* p;
p = head->next;
while (p)
{
printf("%-6d", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
linklist* A;
int choice_01;
int n1;
A = (linklist*)malloc(sizeof(linklist));
printf("选择A链表生成长度:");
scanf("%d", &n1);
CreateList_02(A, n1);
Out(A);
getch();
system("cls");
do
{
Menu();
printf("请选择你要的操作 select(1-6)\n");
scanf("%d", &choice_01);
switch (choice_01)
{
case 1:
Out(A);
printf("逆转后\n");
Reverse_01(A);
Out(A);
getch();
system("cls");
break;
case 2:
Out(A);
printf("逆转后\n");
Reverse_02(A, n1);
Out(A);
getch();
system("cls");
break;
case 3:
Out(A);
printf("逆转后\n");
Reverse_03(A, n1);
Out(A);
getch();
system("cls");
break;
case 4:
Out(A);
printf("逆转后\n");
Reverse_04(A);
Out(A);
getch();
system("cls");
break;
case 5:
Out(A);
printf("逆转后\n");
Reverse_05(A);
Out(A);
getch();
system("cls");
break;
case 6:break;
default:
printf("请不要乱输入选项!\n");
break;
}
} while (choice_01 != 6);
printf("感谢使用\n");
return 0;
}