大家帮看看 编写一个将顺序表L中元素逆置的算法。并只允许增加一个附加的工作空间
// 顺序表逆序.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdafx.h"
#include<iostream>
#include"malloc.h"
#include"stdio.h"
using namespace std;
typedef char ET;
typedef int Status;
typedef int ElemType ;
#define ListIncrement 4
#define List_Init_Size 12
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW 2
typedef struct {
ET *elem;
int length;
int ListSize;
}SqList;
Status InitList(SqList *L){
L->elem=(ET*)malloc(List_Init_Size*sizeof(ET));
if(L->elem==NULL)
exit(OVERFLOW);
L->length=0;
L->ListSize=List_Init_Size;
memset(L->elem+L->ListSize-1, 0, L->ListSize);
return OK;
}
Status ListInsert(SqList*L,int i,ET e){
ET *p;
ET *q;
if(i<0||i>L->length+1)
exit(OVERFLOW);
if (L->length >= L->ListSize) {
p=(ET*)realloc(L->elem,(L->ListSize+ListIncrement)*sizeof(ET));
memset(p+L->ListSize, 0, ListIncrement);
if(p==NULL)exit(OVERFLOW);
L->elem=p;
L->ListSize+=ListIncrement;
}
q=L->elem+i;
for(p=L->elem+L->length-1;p>=q;p--){
*(p+1)=*p;
}
*q=e;
return OK;
}
Status Init(SqList*L){
ET e;
int i;
InitList(L);
for(i=0;i<=L->ListSize;i++){
L->length++;
scanf("%c",&e);
if(e=='\n')
{
break;
}
ListInsert(L,i,e);
}
for (i=0;i<L->length;i++){
printf("%c",L->elem[i]);
}
printf("\n");
return OK;
}
Status nixu(SqList*L)
{
ET*P;
P=(ET*)malloc(sizeof(ET));
int e=0;
int i;
while(e!=L->length-1)
{
for (i=L->length-1;i>0;i--)
{
if (i==L->length-1)
{
*P=L->elem[L->length-1];
}
L->elem[i]=L->elem[i-1];
}
L->elem[e]=*P;
e++;
// printf("%c",L->elem[j]);
}
for (int j=0;j<L->length;j++)
{
printf("%c",L->elem[j]);
}
printf("\n");
return OK;
}
int main()
{
SqList L1;
printf("请输入顺序表L1元素:");
InitList(&L1);
Init(&L1);
//fflush(stdin);
nixu(&L1);
return 0;
}
[解决办法]
递归和非递归的解法如下:
struct Node{ Node* next; int i;};Node* reverse_list(Node* header){ if (header->next != NULL) { Node* new_next = reverse_list(header->next); new_next->next = header; header->next = NULL; } return header;}Node* reverse_list_non_r(Node* header){ Node* curr = NULL, *next = header; while(next != NULL) { Node* next_next = next->next; next->next = curr; curr = next; next = next_next; } return curr;}