单链表反转【C语言】
给定一个单链表,给定两个整数left、right,将该链表的第left和第right个节点反转
#include <stdio.h>
#include <stdlib.h>
#define elemtype int
int num=0;
typedef struct Node
{
elemtype data;
struct Node *next;
}Node;
typedef Node* Linklist;
void Initlist(Linklist *L)
{
*L=(Linklist)malloc(sizeof(Node));
(*L)->next=NULL;
}
void CreateFromTail(Linklist L)
{
int i=0;
Node *r=L,*s;
elemtype e;
while(i!=num)
{
scanf("%d",&e);
s=(Node*)malloc(sizeof(Node));
s->data=e;
r->next=s;
r=s;
i++;
}
r->next=NULL;
}
void CreateFromHead(Linklist L)
{
Node *s;
int i=0;
elemtype e;
while(i!=num)
{
scanf("%d",&e);
s=(Node*)malloc(sizeof(Node));
s->data=e;
s->next=L->next;
L->next=s;
i++;
}
}
void InsList(Linklist L,int i,elemtype e)
{
Node *pre,*s;
pre=L;
int k=0;
while(pre!=NULL && k<i-1)
{
pre=pre->next;
k=k+1;
}
if(pre==NULL)
{
printf("插入位置不合理!");
return;
}
s=(Node*)malloc(sizeof(Node));
s->data=e;
s->next=pre->next;
pre->next=s;
}
void DelList(Linklist L,int i)
{
Node *pre,*r;
pre=L;
int k=0;
while(pre->next!=NULL && k<i-1)
{
pre=pre->next;
k=k+1;
}
if(pre->next==NULL)
{
printf("该位置不合理!\n");
return;
}
r=pre->next;
pre->next=r->next;
free(r);
printf("已释放此结点!\n");
}
void change(Linklist L,int l,int r)
{
if(l>num||l<1)
{
printf("左结点不合理!\n");
return;
};
if(r>num||r<1)
{
printf("右结点不合理!\n");
return;
};
Node *p,*q,*new;
p=(Node*)malloc(sizeof(Node));
q=(Node*)malloc(sizeof(Node));
new=(Node*)malloc(sizeof(Node));
p=L;
int i=1;
for(i=1;i<=r;i++)
{
p=p->next;
if(i==l)
{
new->data=p->data;
q=p;
}
}
q->data=p->data;
p->data=new->data;
}
void view(Linklist L)
{
printf("此链表为:\n");
Node *p;
p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
Linklist L;
Initlist(&L);
printf("请您输入--元素的总个数:\n");
scanf("%d",&num);
printf("若使用头插法请输入--'H'\n");
printf("若使用尾插法请输入--‘T’\n");
char I;scanf("%s",&I);
printf("请您输入--元素:\n");
if(I=='H')
{
CreateFromHead(L);
}
else
{
CreateFromTail(L);
}
view(L);
printf("您想反转哪两个结点:\n");
int left,right;scanf("%d%d",&left,&right);
change(L,left,right);
view(L);
printf("Hello World!\n");
return 0;
}
请您输入--元素的总个数:
5
若使用头插法请输入--'H'
若使用尾插法请输入--‘T’
T
请您输入--元素:
1 2 3 4 5
此链表为:
1 2 3 4 5
您想反转哪两个结点:
1 3
此链表为:
3 2 1 4 5
Hello World!
Program ended with exit code: 0
Copyright © 2019 wyq. All rights reserved. |
---|