本帖最后由 lightninng 于 2015-3-20 09:16 编辑
首先说,想节省空间,相对的一般要用时间来换,提一种思路解决你说的问题
借用链表的方法typedef struct LNode
{
char *str;
struct Node *next;
}LNode;
main()
{
LNode *head = NULL;#用于记录头结点的位置
LNode *p =NULL,*pre = NULL;
char *temp_str; #用于暂时存放输入的字符串
for (i=0;i<1000;i++)
{
p = (LNode *)malloc(sizeof(LNode));#p指向新生成的结点
scanf("%s",temp_str);
p->str = temp_str;
p->next = head;
head = P;#头插法生成链表
}
#以下为冒泡法排序
int i,j;
for(i = 1000; i > 0; i--)
p = head;
pre = NULL;
for(j = 0; j < i; j++)
if(strcmp(p->str,p->next->str)>0)
{
#若p指向结点所存字符串比后一结点的大刚交换两者位置
if(pre)
{
head = p->next;#若p指向头结点则在交换结点位置前需要更改头指针的指向
}
else
{
pre->next = P->next;#若p未指向头结点则在交换结点位置前先要将p前一结点的指针指向新的位置
}
#交换p和p下一个结点的位置
pre = p->next;
p->next = pre->next;
pre->next = p;
}
else
{
#反之则将p和pre指针后移继续检查后继结点
pre = p, p = p->next
}
#按排好的顺序输出字符串
for(p = head; p; p = p->next)
printf("%s", p->str);
}
上面这段代码的错误在于,新建的结构体结点内的str指针未初始化,不能用于scanf函数中,可以改变它的指向,为了达到楼主所说的节省空间,代码改为下面这样typedef struct LNode
{
char *str;
struct Node *next;
}LNode;
main()
{
LNode *head = NULL;#用于记录头结点的位置
LNode *p =NULL,*pre = NULL;
for (i=0;i<1000;i++)
{
int str_len,count;
char temp_char;
char* temp_str = (char*)malloc(sizeof(char*) * 5);
for(int i = 0; i < 1000; i++)
{
#这段代码用于创建一个申请空间等于输入字符数的字符串
str_len = 5,count = 0;
printf("Please input a string: ");
temp_str = (char*)malloc(temp_str, sizeof(char*) * 5);
do
{
temp_char = getchar();
count++;
if (count >= str_len)
temp_str = (char*)realloc(temp_str, sizeof(char*) * (++str_len));
temp_str[count-1] = temp_char;
} while (temp_char != '\n');
temp_str[count] = '\0';
#将得到的字符串的首地址赋于结点p中的str指针
p = (LNode *)malloc(sizeof(LNode));#p指向新生成的结点
p->str = temp_str;
p->next = head;
head = P;#头插法生成链表
}
}
#以下为冒泡法排序
int i,j;
for(i = 1000; i > 0; i--)
p = head;
pre = NULL;
for(j = 0; j < i; j++)
if(strcmp(p->str,p->next->str)>0)
{
#若p指向结点所存字符串比后一结点的大刚交换两者位置
if(pre)
{
head = p->next;#若p指向头结点则在交换结点位置前需要更改头指针的指向
}
else
{
pre->next = P->next;#若p未指向头结点则在交换结点位置前先要将p前一结点的指针指向新的位置
}
#交换p和p下一个结点的位置
pre = p->next;
p->next = pre->next;
pre->next = p;
}
else
{
#反之则将p和pre指针后移继续检查后继结点
pre = p, p = p->next
}
#按排好的顺序输出字符串
for(p = head; p; p = p->next)
printf("%s", p->str);
}
链表的好处是每当你输入一个新的字符串你都可以创建一个新的结点去存储它,然后链接到链表的头部或者尾部即可(头插和尾插),坏处是不能随机查找(即按位置取值),但是题目要求只是顺序输出字符串,冒泡法也只用比较相邻的结点数据,相对来说比较好用,其实,这么麻烦的实现方法,楼主还不如直接多申请点空间保存你的字符串 |