/************************************************************************************
/*此程序的主要功能为建表,以及逆置建立好的表
/*有些链表的函数并未用到,但是在日后的实验中,可能会被用到,因为是基本操作。
/*未用到的函数已全部注释。
************************************************************************************/
#include <stdio.h>
//宏定义
#define OK 1;
#define ERROR -1;
//类型预定义
typedef int ElemType;
typedef int Status;
//定义单链表的结点
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
//初始化单链表
Status InitList(LinkList L,int n)
{
//变量定义
int i;
LinkList p=L,s;
//设置头结点
L->data=0;
L->next=NULL;
for(i=0;i<n;i++)
{
s=(LinkList)malloc(sizeof(LNode));
scanf("%d",&(s->data));
s->next=p->next;
p->next=s;
p=s;
}//尾插法
return OK;
}
/**
//此函数在此次实验中未用到,但是日后可能会用到
//获取链表指定位置的元素
Status GetElem(LinkList L,int k,ElemType *e)
{
int i=1;
LinkList p=(LinkList)malloc(sizeof(LNode));
p=L->next;
while(NULL!=p&&i<k)
{
p=p->next;
++i;
}
if(NULL==p||i>k)
{
return ERROR;
}
*e=p->data;
return OK;
}
*/
/**
//此函数在此次实验中未用到,但是日后可能会用到
//在链表第k个元素之前插入元素e
Status InsNode(LinkList L,int k,ElemType *e)
{
int i=0;
ElemType data;
LinkList p=L,s;
if(NULL==p)
{
printf("非法的表!\n");
return ERROR;
}
while(NULL!=p&&i<k-1)
{
p=p->next;
++i;
}//寻找到第k-1个结点
if(NULL==p||i>k-1)
{
return ERROR;
}
s=(LinkList)malloc(sizeof(LNode));
s->data=*e;
s->next=p->next;
p->next=s;
return OK;
}
*/
/**
//此函数在此次实验中未用到,但是日后可能会用到
//删除单链表中的第k个元素,并由e返回其值
Status DelNode(LinkList L,int k,ElemType *e)
{
LinkList p=L,q;
int i=0;
while(NULL!=p->next&&i<k-1)
{
p=p->next;
++i;
}//寻找第k个结点,并令p指向其前驱
if(NULL==p->next||i>k-1)
{
return ERROR;
}
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
return OK;
}
*/
//逆置单链表,返回逆置后的单链表
LinkList ReverseList(LinkList L)
{
LinkList revList=(LinkList)malloc(sizeof(LNode)); //定义一个新的单链表结点 revList,用于保存逆置后的单链表
LinkList p=L->next,s; //初始化指针p
//初始化revList的头结点
revList->data=0;
revList->next=NULL;
while(NULL!=p)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=p->data;
s->next=revList->next;
revList->next=s;
p=p->next;
}//前插法(与建表时的尾插法相反,因此得到的表revList是逆置的表)
return revList;
}
//输出单链表中所有结点的值
Status OutPutList(LinkList L)
{
LinkList p=L->next;
while(NULL!=p)
{
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
return OK;
}
int main()
{
//变量定义
int n;
LinkList L=(LinkList)malloc(sizeof(LNode));
LinkList revList;
//输入提示
printf("请输入初始单链表的结点数:\n");
scanf("%d",&n);
printf("请输入结点的值:\n");
InitList(L,n); //建表
printf("您建立的表为:\n");
OutPutList(L); //输出建立的表
revList=ReverseList(L); //逆置
printf("该表逆置后为:\n");
OutPutList(revList); //输出逆置后的表
return 0;
}
逆置链表
最新推荐文章于 2021-11-13 14:48:26 发布