目录
-
题目内容
试分别用顺序表和单链表作为存储结构,实现线性表就地逆置的操作,所谓“就地”,指辅助空间应为O(1)。
-
算法分析
-
顺序表:要将该表逆置,可以将表中的开始结点与终端结点互换,第二个结点与倒数第二个结点互换,如此反复,就可以将两个表逆置了。
链表:可以用交换数据的方式来达到逆置的目的。但是由于是链表,数据的存取不是随机的因此算法效率太低。可以利用指针改指来达到表逆置的目的。
-
概要分析
-
函数:
-
(1) 顺序表
函数CreateList()用来创建线性表
函数PrintList()用来输出线性表
函数ReverseList()用来逆置线性表
主函数main()
(2)单链表
函数InitList()用来初始化链表
函数CreateLinkList()用来尾插法建立链表
函数ReverseList()用来逆置单链表
函数PrintLinkList()用来打印单链表
主函数main()
算法流程图
逆置顺序表流程图
逆置单链表流程图
源代码
顺序表代码
/**************
@author:sy
@date:2021-10-4
@version:1.0
@Description:逆置顺序表
****************/
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 100 //最长的长度为100
typedef struct //结构体的定义
{
int elem[MAXSIZE]; //定义数组域
int length; //线性表实际的长度
}SeqList;
/*创建线性表*/
void CreateList(SeqList *L)
{
int len; //线性表长度
int i;
printf("请输入你想要的线性表长度:\n");
scanf("%d",&len);
if(len==0||len>MAXSIZE)
{
printf("你输入的长度有误\n");
return;
}
L->length=len;
printf("请输出%d长度线性表的每一个值:\n",len);
for(i=0;i<len;i++) //遍历线性表
{
scanf("%d",&L->elem[i]);
}
}
/*输出线性表*/
void PrintList(SeqList *L)
{
int i,n;
n=L->length;
if(n==0||L->length>MAXSIZE)
{
return;
}
printf("线性表目前包含的元素为:");
for(i=0;i<n;i++)
{
printf("%d",L->elem[i]);
printf(" ");
}
printf("\n");
}
/*逆置*/
void ReverseList(SeqList *L)
{
int i,j;
if(L->length==0||L->length>MAXSIZE)
{
return;
}
for(i=0,j=L->length-1;i<j;i++,j--) //j指代数组下标,length是线性表长度,所以j==length-1
{
/*开始结点与终端结点交换,第二个结点与倒数第二个结点交换,重复操作*/
int temp;
temp=L->elem[i];
L->elem[i]=L->elem[j];
L->elem[j]=temp;
}
}
int main(int argc, const char * argv[])
{
SeqList L;
L.length=0;
CreateList(&L);
PrintList(&L);
printf("\n逆置之后\n");
ReverseList(&L);
PrintList(&L);
return 0;
}
单链表代码
/********
@author:sy
@date:2021-10-4
@version:1.0
@Description:逆置单链表
********/
#include<stdio.h>
#include<stdlib.h>
/*结点类型定义*/
typedef struct Lnode
{
int data; //数据域
struct Lnode *next; //指针域
}Lnode,*LinkList;
/*初始化链表*/
void InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(Lnode));
L->next=NULL; //建带头结点的空链表
}
/*尾插法建立单链表*/
void CreateLinkList(LinkList &L,int n)
{
LinkList p,r;
r=(LinkList)malloc(sizeof(Lnode));
r=L; //尾指针r指向表尾
for(int i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Lnode)); //为读入的字符分配空间
scanf("%d",&p->data);
/*依次从表尾插入*/
p->next=NULL;
r->next=p;
r=p;
}
}
/*打印链表*/
void PrintLinkList(LinkList &L)
{
LinkList p;
for(p=L->next;p!=NULL;p=p->next)
{
printf("%d ",p->data);
}
printf("\n");
}
/*逆置链表*/
void ReverseList(LinkList &L)
{
LinkList p,q;
p=L->next;
L->next=NULL; //将开始结点变成终端结点
while(p!=NULL)
{
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}
int main()
{
LinkList L;
InitList(L);
printf("单链表初始化成功\n");
printf("\n输入单链表为(数据之间用空格隔开):");
CreateLinkList(L,5);
printf("\n逆置后的单链表为:");
ReverseList(L);
PrintLinkList(L);
return 0;
}