三九宝宝网宝宝教育教学论文

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

02月22日 编辑 39baobao.com

[用C语言实现链表的算法]这个是我们数据结构上机实验的链表问题, #include<stdio.h> #include<malloc.h> #define LEN sizeof(LinkNode) typedef int Datatype; typedef int Status; typedef struct...+阅读

从键盘输入不定数量的数字构造链表,输入0结束,然后排序输出,代码如下:

#include

#include

#include

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;

}

望采纳

以下为关联文档:

用C语言实现数据结构中常用算法如对链表的操作查找排序#include <iostream.h> class ram { public: char wenzi[200]; ram *p; }; ram wo,*ai=&wo; int num=0;//我申请了几次内存了 void xie(void);//输入数据,然后分配内存为下次做...

C语言怎么用二分查找插入排序一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 1. 从第一个元素开始,该元素可以认为已经被排序 2. 取出下一个元素,在已经排序的元素序列中从后向前扫描 3....

你好请问一下怎么用C语言编写单链表插入节点程序万分感谢!#include "sll_node.h" #include #define FALSE 0 #define TRUE 1 // insertNode2:把newValue的值插入到递增排序的链表中,正确返回TRUE,错误返回FALSE // nextp是指向当前节点的...

C语言用函数排序#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int array[10]; int i,j,min,stmp; for(i=0;i<10;i++) scanf("%d",&array[i]); for(i=0;i<9;i+...

用C语言写一个快速排序法不要用库函数include<stdio.h> void main() { int a[]={8,4,24,1,54,87,113,39};//这里的元素可以手动输入,用for循环输入,先给定数组长度N //再一次输入数组元素 /* int n; scanf("&%d",n);...

帮忙做道C语言的题双向链表的排序#includetypedef struct Link/*双向链表结构体*/{ int data; struct Link *lift; struct Link *right;}linkx,*linky;linky Init();/*建立双向链表*/void PrLink(linky p);/*输...

求高手做个c语言设计一个双向链表的排序#includetypedef struct Link/*双向链表结构体*/ { int data; struct Link *lift; struct Link *right; }linkx,*linky; linky Init();/*建立双向链表*/ void PrLink(linky p)...

急!求c语言单链表冒泡排序的详细流程图#include struct number { int num; struct number *next; }; void main() { struct number *head; struct number *p1,*p2,*p,*p3,*p4; int n=0,m,i,j; p1=p2=(struct numb...

如何用c语言实现单链表的逆置1、算法的核心就是reverse函数,其它的都是辅助建立链表和输出链表的。从数据结构的定义来看这是一个带头节点的链表。要弄的十分明白要耐心点画图看看。 2、思路:head是指向头...

推荐阅读
图文推荐