#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node* next;
}node;
node* establish(node* p);
void ergodic(node* p);
node* reserve(node* p);
int lenth(node* p);
int lenth(node* p)
{
node* tmp = p;
int cnt = 0;
while (tmp->next)
{
tmp = tmp->next;
cnt++;
}
return cnt;
}
int main(int argv, const char* argc[])
{
node* p = NULL;
p=establish(p);
ergodic(p);
p = reserve(p);
ergodic(p);
}
node* establish(node* p)
{
printf("please press the number of node\n");
int lenth;
int dataofnode;
scanf("%d", &lenth);
printf("please press the data of node\n");
p = (node*)malloc(sizeof(node));
p->next = NULL;
for (int i = 0; i < lenth; i++)
{
scanf("%d", &dataofnode);
node* tmp = p;
while (tmp->next)
{
tmp = tmp->next;
}
node* temp = (node*)malloc(sizeof(node));
temp->data = dataofnode;
temp->next = NULL;
tmp->next = temp;
}
printf("the linked list has been established with an empty head node\n");
return p;
}
void ergodic(node* p)
{
node* tmp = p;
while (tmp->next)
{
printf("%d\n", tmp->next->data);
tmp = tmp->next;
}
return 0;
}
node* reserve(node* p)
{
printf("please press the digit of reserve\n");
int digit;
scanf("%d", &digit);
int lenthoflink = lenth(p);
if (digit==lenthoflink-1)
{
node* new = p->next;
node* old = new->next;
node* tmp = old->next;
for (int i = 1; i < digit-1; i++)
{
old->next = new;
new = old;
old = tmp;
tmp = tmp->next;
}
p->next->next = tmp;
old->next = new;
p->next = old;
}
else if(digit>= lenthoflink)
{
node* new = p->next;
node* old = new->next;
node* tmp = old->next;
for (int i = 1; i < lenthoflink-2; i++)
{
old->next = new;
new = old;
old = tmp;
tmp = tmp->next;
}
p->next->next = NULL;
p->next = tmp;
tmp->next = old;
old->next = new;
}
else
{
node* new = p->next;
node* old = new->next;
node* tmp = old->next;
for (int i = 1; i < digit; i++)
{
old->next = new;
new = old;
old = tmp;
tmp = tmp->next;
}
p->next->next = old;
p->next = new;
}
return p;
}