永发信息网

怎么用C语言写单链表的排序

答案:2  悬赏:50  手机版
解决时间 2021-04-27 08:07
  • 提问者网友:献世佛
  • 2021-04-27 03:42
head指向链表的头节点,
最佳答案
  • 五星知识达人网友:神的生死簿
  • 2021-04-27 05:08
从键盘输入不定数量的数字构造链表,输入0结束,然后排序输出,代码如下:

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

typedef struct _list {
int val;
struct _list* next;
} *node, list;


node Insert( node* head, node pos, int val )
{
node tmp;
tmp = ( node )malloc( sizeof( list ) );
tmp->val = val;
tmp->next = pos ? pos->next : *head;
if ( pos ) {
pos->next = tmp;
} else {
*head = tmp;
}
return tmp;
}


node Create( void )
{
node head, t;
int n;
head = t = NULL;
while ( scanf( "%d", &n ) && n != 0 ) {
t = Insert( &head, t, n );
}
return head;
}


void Print( node head )
{
while ( head ) {
printf( "%d ", head->val );
head = head->next;
}
putchar( '\n' );
}


node msort( node* head, int n )
{
int i, m;
node l, r, p, *x, *y;
if ( n < 2 ) return *head;
m = n/2;
p = l = r = *head;
for ( i = m; i > 0; --i )
p = r, r = r->next;
p->next = NULL;
l = msort( &l, m );
r = msort( &r, n - m );
x = &p;
while ( l && r ) {
*x = l->val < r->val ? (y = &l, l) : (y = &r, r);
*y = (*y)->next; x = &(*x)->next;
}
l = l ? l : r ? r : NULL;
*x = l; *head = p;
return p;
}


void Sort( node* head )
{
int i;
node tmp = *head;
for ( i = 0; tmp; ++i, tmp = tmp->next );
msort( head, i );
}


int main( void )
{
node head = Create();
Print( head );
Sort( &head );
Print( head );
getch();
return 0;
}


望采纳
全部回答
  • 1楼网友:第四晚心情
  • 2021-04-27 05:34
#include"stdio.h" #include"stdlib.h" #define MAX 20 struct node { int num; struct node *next; }; typedef struct node node; void main() { int a[MAX]={4,3,3,7,4,8,1,2,2,7,6,7,9,12,15,0,-1,243,23,1}; int i; node *head,*p,*tail,*t; head=NULL; for (i=0;i<MAX;i++) { p=(node *)malloc(sizeof(node)); p->num=a[i]; p->next=NULL; if (head==NULL) head=t=p; else { t=head; while (t!=NULL) { if (p->num<t->num && t->next==NULL) { t->next=p; break; } else if (p->num>t->num && t!=head) { tail->next=p; p->next=t; break; } else if (p->num>t->num && t==head) { p->next=t; head=p; break; } tail=t; t=t->next; } } } while (head!=NULL) { printf("%d,",head->num); head=head->next; } printf("\n"); }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯