求助修改程序~~(c语言 线性表实现数据循环右移动)

作业要求:
编程显示一个长度为n的整数数组循环右移m位的结果。
例如,当有数组元素{1 ,2 ,3 ,4 ,5, 6 ,7 ,8 ,9 ,10 }
若n=10, m=3,
循环右移后的数组的排列为
{ 8, 9,10 ,1, 2 ,3, 4 ,5, 6 ,7 }
我写的程序没有显示错误,但运行不出结果……求帮忙修改~~非常感谢~~

#include <stdio.h>
#include <stdlib.h>

#define MAXNUM 100 /*顺序表中最大的元素个数*/
#define FALSE 0
#define TRUE 1
typedef int DataType;

struct SeqList
{
int n; /*存放线性表中元素的个数n<=MAXNUM*/
DataType *element; /*存放线性表中的元素*/

};
typedef struct SeqList*PSeqList;

PSeqList createNullList_seq(void) /*创建一个空顺序表*/
{
PSeqList palist;
palist=(PSeqList)malloc(sizeof(struct SeqList));
if (palist!=NULL)
palist->element = (DataType * )malloc(sizeof(DataType));
if (palist->element!=NULL)
{
palist->n=0; /*空表长度为0*/
return(palist);
}
else free(palist);
printf("out of space!\n"); /*存储分配失败*/
return (NULL);
}

int rotate_right(PSeqList palist,int n,int m) /*定义rotate_right函数,即使数据循环右移动*/
{

if(palist->n==MAXNUM) /*溢出*/
{
printf("Over flow!\n");
return(0);
}
else
{
int j;
int q; /*定义临时下标q*/
for(j=0;j<m;j++)
{
for(q=palist->n-1;q>=0;q--)
{
palist->element[q+1]=palist->element[q]; /*所有元素均后移一个位置*/
palist->n=palist->n+1;
palist->element[0]=palist->element[n-1];
palist->n=palist->n-1;
}
}
return(1);
}
}

int main()
{
int rotate_right(PSeqList palist,int n,int m); /*对rotate_right函数进行声明*/
PSeqList ROR_alist;
int n,m;
int i;
printf("请输入整数数组元素个数n(注:n<100):\n");
scanf("%d",&n);
if(n>=MAXNUM)
{
printf("Overflow!\n");
return(0);
}
ROR_alist=createNullList_seq();
if(ROR_alist!=NULL)
{
printf("请输入数组元素:\n"); /*输入数组元素*/
for(i=0;i<n;i++)
scanf("%d",&ROR_alist->element[i]);
printf("请输入循环右移的位数m:\n");
scanf("%d",&m);
rotate_right(ROR_alist,n,m); /*调用rotate_right函数*/
printf("原数组排列为:\n");
for(i=0;i<n;i++)
printf("%d",&ROR_alist->element[i]);
printf("\n");
printf("循环右移后的数组的排列为:\n");
for(i=0;i<n;i++)
printf("%d",&ROR_alist->element[i]);
printf("\n");
}
free(ROR_alist->element);
free(ROR_alist);
return(1);
}

我觉得是自己定义的rotate_right函数出了问题……死循环神马的(额……我不懂……)

#include <stdio.h>
#include <stdlib.h>

#define MAXNUM 100 /*顺序表中最大的元素个数*/
#define FALSE 0
#define TRUE 1
typedef int DataType;

struct SeqList
{
int n; /*存放线性表中元素的个数n<=MAXNUM*/
DataType *element; /*存放线性表中的元素*/

};
typedef struct SeqList*PSeqList;

PSeqList createNullList_seq(void) /*创建一个空顺序表*/
{
PSeqList palist;
palist=(PSeqList)malloc(sizeof(struct SeqList));
if (palist!=NULL)
palist->element = (DataType * )malloc(sizeof(DataType));
if (palist->element!=NULL)
{
palist->n=0; /*空表长度为0*/
return(palist);
}
else free(palist);
printf("out of space!\n"); /*存储分配失败*/
return (NULL);
}

void rotate_right(PSeqList palist,int n,int m) /*定义rotate_right函数,即使数据循环右移动*/
{
if(palist->n==MAXNUM) /*溢出*/
{
printf("Over flow!\n");
return;
}
else
{
int j,q,k; /*定义临时下标q*/
for(j=0;j<m;j++)
{
k=palist->element[n-1];
for(q=n-1;q>=0;q--)
{
palist->element[q]=palist->element[q-1];
}
palist->element[0]=k;
}
}
}

int main()
{
/*对rotate_right函数进行声明*/
PSeqList ROR_alist;
int n,m;
int i;
printf("请输入整数数组元素个数n(注:n<100):\n");
scanf("%d",&n);
if(n>=MAXNUM)
{
printf("Overflow!\n");
return(0);
}
ROR_alist=createNullList_seq();
if(ROR_alist!=NULL)
{
printf("请输入数组元素:\n"); /*输入数组元素*/
for(i=0;i<n;i++)
scanf("%d",&ROR_alist->element[i]);
printf("原数组排列为:\n");
for(i=0;i<n;i++)
printf("%d",ROR_alist->element[i]);
printf("\n");
printf("请输入循环右移的位数m:\n");
scanf("%d",&m);
rotate_right(ROR_alist,n,m); /*调用rotate_right函数*/
printf("循环右移后的数组的排列为:\n");
for(i=0;i<n;i++)
printf("%d",ROR_alist->element[i]);
printf("\n");
}
free(ROR_alist->element);
free(ROR_alist);
return(1);
}
运行调试过了
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-17
不懂C,但问题很多
else
{
int j;
int q; /*定义临时下标q*/
for(j=0;j<m;j++)
{
for(q=palist->n-1;q>=0;q--)
{
palist->element[q+1]=palist->element[q]; /*所有元素均后移一个位置*/
palist->n=palist->n+1;
palist->element[0]=palist->element[n-1];
palist->n=palist->n-1;
}
}
return(1);
}

里面的for循环逻辑有问题,但貌似不应该死循环

改一下
for(j=0;j<m;j++)
{
int lastElement = palist->element[n-1];
for(q=palist->n-1;q>0;q--)
{
palist->element[q] = palist->element[q-1];
}
palist->element[0] = lastElement;

}

此外,你读取的时候貌似也有问题。
创建了一个空列表之后,palist所指向的element只被分配了一次空间。

应当在
printf("请输入整数数组元素个数n(注:n<100):\n");
scanf("%d",&n);
之后,就为element分配长度为n个整数的空间。

c语言里面怎么创建数组我就不会了,反正类似的应该要执行
palist->element = new int[n] 之类的操作吧
第2个回答  2011-03-17
//经测试,已满足要求。200分不好苦的,希望能满意。
#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 100 /*顺序表中最大的元素个数*/
#define FALSE 0
#define TRUE 1
typedef int DataType;

struct SeqList
{
int n; /*存放线性表中元素的个数n<=MAXNUM*/
DataType *element; /*存放线性表中的元素*/

};
typedef struct SeqList* PSeqList;

PSeqList palist;
PSeqList createNullList_seq(int n) /*创建一个空顺序表*/
{
palist=(PSeqList)malloc(sizeof(struct SeqList));
if (palist!=NULL)
palist->element = (DataType * )malloc(n*sizeof(DataType));
if (palist->element!=NULL)
{
palist->n=0; /*空表长度为0*/
return(palist);
}
else free(palist);
printf("out of space!\n"); /*存储分配失败*/
return (NULL);
}

int rotate_right(PSeqList palist,int n,int m) /*定义rotate_right函数,即使数据循环右移动*/
{

if(palist->n==MAXNUM) /*溢出*/
{
printf("Over flow!\n");
return(0);
}
else
{
int j;
int q; /*定义临时下标q*/
for(j=0;j<m;j++)
{
/*for(q=palist->n-1;q>=0;q--)
{
palist->element[q+1]=palist->element[q];
palist->n=palist->n+1;
palist->element[0]=palist->element[n-1];
palist->n=palist->n-1;

}*/
int t=palist->element[n-1];
for(q=n-1;q>0;q--)
palist->element[q]=palist->element[q-1];
palist->element[0]=t;
}
return(1);
}
}

int main()
{
int rotate_right(PSeqList palist,int n,int m); /*对rotate_right函数进行声明*/
PSeqList ROR_alist;
int n,m;
int i;
printf("请输入整数数组元素个数n(注:n<100):\n");
scanf("%d",&n);
if(n>=MAXNUM)
{
printf("Overflow!\n");
return(0);
}
ROR_alist=createNullList_seq(n);
if(ROR_alist!=NULL)
{
printf("请输入数组元素:\n"); /*输入数组元素*/
for(i=0;i<n;i++)
scanf("%d",&ROR_alist->element[i]);
printf("请输入循环右移的位数m:\n");
scanf("%d",&m);
printf("原数组排列为:\n");
for(i=0;i<n;i++)
printf("%d ",ROR_alist->element[i]);
printf("\n");
rotate_right(ROR_alist,n,m);
printf("循环右移后的数组的排列为:\n");
for(i=0;i<n;i++)
printf("%d ",ROR_alist->element[i]);
printf("\n");
}
free(ROR_alist->element);
free(ROR_alist);
return (1);
}
第3个回答  2011-03-17
看的我晕了
相似回答