#include "stdio.h"
#include "string.h"
void shellsort(char v[][10], int n);
void writeline(char linp[][10],int n);
main()
{
char line[][10]={"C++","Fortran","Basic","Pascal","Foxbase"};
int n=5;
shellsort(line,n);
writeline(line,n);
}
shellsort(char v[][10], int n)
{
char *temp,*t[5];
int i,j;
for(i=0;i
for(i=0;i
if(strcmp(t[j-1],t[j])>0)
{
temp=t[j];
t[j]=t[j-1];
t[j-1]=temp;}
}
writeline(char linp[][10],int n)
{
int i;
for(i=0;i
}
上面是修改过的程序;
关键在于
if(strcmp(v[j-1],v[j])>0)
{t=v[j];v[j]=v[j-1];v[j-1]=t;}
这里面的v[j]=v[j-1];这句不对,因为这是两个地址,也是两个数组,不能赋值
我用了另外的一组指针来指向这个数组
你的函数的定义很奇怪,更奇怪这样的定义也能编译
建议象我这样定义吧,不然别人看程序很困难的.
指针数组的内容是v[i]的地址,字符串数组的v[i]是第i项的内容.值和地址不一回事.了解一下指针的定义.
方法一用来交换字符串的原理是改变指针数组成员指向的地址,这没有问题。
但是如果把line声明成2维数组,数组的地址值是不能随意修改的,所以,你无法强制把line[0]指定到其他地方。
可把方法二的字符串交换处理作如下改动:
{
char
t[10];
int
i,j;
for(i=0;i
for(j=n-1;j>i;j--)
if(strcmp(v[j-1],v[j])>0)
{
/*t=v[j];v[j]=v[j-1];v[j-1]=t;*/
strcpy(t,
v[j]);
strcpy(v[j],
v[j-1]);
strcpy(v[j-1],
t);
}
}