实验要求:
写出将单链表逆置的算法。即令单链表的第一个结点变为最后一个结点,第二个结点变为倒数第二个结点,…,最后一个结点变为第一个结点。
依次从键盘读入数据,逆序建立链表L;
逆置链表L(创建新的链表New保存逆置的结点);
代码解析:
主函数int main():
定义链表的长度n;
调用CreateList函数创建长度为n的链表;
调用InvertList函数将链表内元素转置并输出;
定义链表的结构体类型为LNode,规定结点的数据域和结点的指针域
定义函数struct LNode *CreatList(int n)逆位序创建链表并输出所创建的链表的元素值。
定义需要创建的链表元素个数n;
建立一个带头结点的单链表;
逆序位输入指定元素个数的链表元素数值;
输入逆序位建立链表的链表元素;
定义函数void InverList(struct LNode *L)转置链表内元素并输出。
建立一个带头结点的新链表r;
q指向链表的第一个元素;
开辟新结点s,将q的值赋给s;
令s->next为NULL并使其成为r的后续结点;
利用while循环,将q不断后移,指向链表的后续元素。开辟新结点p,将q的值 赋给p,将p插入结点s和结点i中间;
令s的指针指向p;
输出转置后的链表;
实验代码:
#include <stdio.h>
#include <stdlib.h>
//定义链表类型
struct LNode{
int data; //结点的数据域
struct LNode *next; //结点的指针域
};
//创建逆序链表
struct LNode *CreatList(int n)
{
struct LNode *L,*p;
printf("请输入逆序创建链表的元素的个数:\n"); //确定链表元素的个数
scanf("%d",&n);
L = (struct LNode*)malloc(sizeof(struct LNode));
L->next = NULL; //建立一个带头结点的单链表
printf("请输入逆序链表元素:\n");
while(n--){ //逆序位输入n个元素的数值
p=(struct LNode*)malloc(sizeof(struct LNode));
scanf("%d",&p->data ); //输入指定元素个数的链表元素数值
p->next = L->next ;
L->next =p;
}
printf("输出链表中的元素:\n"); //直接输出所创建的逆序链表
while(p!=NULL)
{
if(p->next ==NULL)
printf("%d\n",p->data );
else
printf("%d\t",p->data );
p=p->next ;
}
return L;
}
//转置链表内元素并输出
void InvertList(struct LNode *L)
{
struct LNode *p,*q,*r,*s,*t;
r = (struct LNode*)malloc(sizeof(struct LNode));
s = (struct LNode*)malloc(sizeof(struct LNode));
r->next=NULL; //建立一个带头结点新链表
q=L->next; //q指向链表第一个元素
s->data=q->data;
s->next=NULL;
r->next=s;
while(q->next !=NULL)
{
q=q->next;
p = (struct LNode*)malloc(sizeof(struct LNode));
p->data=q->data;
p->next=s;
r->next=p;
s=p;
}
printf("输出转置后的链表:\n");
t=r->next;
while(t!=NULL) //直接输出转置后的链表
{
printf("%d\t",t->data );
t=t->next ;
}
printf("\n");
}
//主函数
int main()
{
int n;
struct LNode *L;
L=CreatList(n);
InvertList(L);
}