用双向链表对字符串进行排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct string{
 
char *s;
 
struct string *next;
 
struct string *prior;
}str;

void PrintLink(str*  node);
str
* InitLink();
int LinkNum(str* head);
str
* GetTail(str* head,int num);
void SortLink(str* head,str* tail);
int main(void)
{      
        str
* head;
        str
* tail;
        head
= InitLink();
       
int num = 0;
        num
= LinkNum(head);
        tail
= GetTail(head,num);
       
SortLink(head,tail);
       
PrintLink(head);
}
str
* GetTail(str *head,int num)
{
str
* p;
 
int sum = 0;

 p
= (str*)malloc(sizeof(str));
 p
= head;
 
while(p != NULL)
 
{
  sum
++;
  p
= p->next;
 
if(num-1 == sum)
 
{
   
return p;
 
}
 
}
}
str
* InitLink()
{
       
char st[50];
         str
*head,*ps,*lochead,*tail;
         head
= (str *)malloc(sizeof(str));
         tail
= (str *)malloc(sizeof(str));
        lochead
= head;
         
while(1)
           
{

                  ps
= (str *)malloc(sizeof(str));
                  lochead
->next = ps ;
                  ps
->prior = lochead ;
                  printf
("input data:");
                  scanf
("%s",st);
                 ps
->s = (char*)malloc(strlen(st)*sizeof(char));
                  strcpy
( ps->s , st);
                printf
("listInfo:%s",ps->s);  
                lochead
= ps;
                  printf
("输入exit退出:");
                  scanf
("%s",st);
                 
if(!strcmp("exit",st))
                   
break;
           
}
         head
= head->next;
         head
->prior= NULL;
        lochead
->next = NULL;
       
return head;
}

void PrintLink(str*  node)
{
 str
*  q;
 q
= (str *)malloc(sizeof(str));
 printf
("Now the link: ");
 
do
 
{
   q
=node;
   printf
("%s ",(node->s));
   node
=node->next;
   free
(q);
 
}
 
while(node!=NULL);
 
char c;
  c
= getchar();
}

int LinkNum(str* head)
{
 
int sum = 0;
 str
* p;
 p
= head;
 
while(p != NULL)
 
{
  p
= p->next;
  sum
++;
 
}
 
return sum;
}

void SortLink(str* head,str* tail)
{
str
*q,*p,*flag;
 q
= (str*)malloc(sizeof(str));
 p
= (str*)malloc(sizeof(str));
 flag
= (str*)malloc(sizeof(str));
 flag
= head;
 p
= tail;
 q
= NULL;

 
while (flag != NULL)
     
{
           flag
= NULL;

     
for (q = head; q != p; q = q->next)
           
{
               
if (strcmp((q->s),(q->next->s)) > 0)
               
{
                         
// char* t= (char *)malloc( q->num * sizeof(char) );
                       
char* t = (char *)malloc(strlen(q->s)*sizeof(char));  
                       
//*t =* (q->s);
                           strcpy
(t,q->s);
                           
//*(q->s) = *(q->next->s);
                           strcpy
(q->s,q->next->s);
                           
//*(q->next->s) = *t;
                           strcpy
(q->next->s,t);
                           flag
= q;
               
}
           
}

           p
= flag;
     
}
}

对比一下整形,看看有什么变化,我是在LINUX环境下写的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值