单链表逆置操作要求不创建新节点,直接完成逆置操作。
#include <stdio.h>
#include <stdlib.h>
#define max 5
typedef struct list
{
int data[max];
int length;
}sqlist;
typedef struct node
{
int data;
struct node *next;
}Node,*Linklist;
sqlist initlist (sqlist L);
void reverse (sqlist L);
void print(sqlist L);
Linklist initlinklist(Linklist L);
void reverselist(Linklist L);
void printlist(Linklist L);
void main()
{
sqlist L;
L=initlist(L);
reverse(L);
// reverse(initlist(L));
Linklist L2;
L2=initlinklist(L2);
reverselist(L2);
}
sqlist initlist (sqlist L)
{
for (int i=0;i<max;i++)
{
printf("请输入顺序表元素值 ");
scanf("%d",&L.data[i]);
}
L.length=max;
printf("顺序表构造结束\n");
print(L);
return L;
}
void reverse (sqlist L)
{
int i,j,temp;
i=0;
j=L.length-1;
while (i<j)
{
temp=L.data[i];
L.data[i]=L.data[j];
L.data[j]=temp;
i++;
j--;
}
print(L);
}
void print(sqlist L)
{
printf("调用打印函数,当前顺序表状态如下:\n");
for (int i =0;i<L.length;i++)
{
printf (" %d ",L.data[i]);
}
printf("\n");
}
Linklist initlinklist(Linklist L)
{
Linklist p;
Linklist q;
Linklist f;
L=(Linklist)malloc(sizeof(Node));
int counter=0;
for (int i=0;i<max;i++)
{
p=(Linklist)malloc(sizeof(Node));
printf("输入单链表节点值: ");
scanf("%d",&p->data);
counter++;
if (counter==1)
{
q=p;
f=p;
}
else
{
f->next=p;
f=f->next;
}
}
p->next=NULL;
L->next=q;
printf("单链表创建结束\n");
printlist(L);//打印初始状态下的链表
return L;
}
void reverselist(Linklist L)
{
Linklist p,q;
p=L->next;
q=p->next;
L->next=NULL;
while(p!=NULL)
{
p->next=L->next;//断旧链,接新链
L->next=p;//头结点后继接入
p=q;
if(q!=NULL)
q=q->next;
if (q==NULL&&p==NULL)
break;
}
printf("逆置结束\n");
printlist(L);
}
void printlist(Linklist L)
{
printf("调用打印函数,当前状态如下:\n");
for (int i=0;i<max;i++)
{
L=L->next;
printf(" %d ",L->data);
}
printf("\n");
}