[用C语言实现数据结构中常用算法如对链表的操作查找排序等]#include <iostream.h> class ram { public: char wenzi[200]; ram *p; }; ram wo,*ai=&wo; int num=0;//我申请了几次内存了 void xie(void);//输入数据,然后分配内存为下次做...+阅读
你稍微改动下,应该可以,算法是一样的
void order() { t=head; p=head; // r=head;//head是原链表的头 u=0; //t指向链表中score最大的一个链 while(p->next!=0) { if(p->next->score > t->score) { t=p->next; u=p; } // if(p!=head)r=r->next;//r比p少前进一次,即r指向p前一格 p=p->next; } q=s=t;//q是排序后新链表的头 if(u!=0)u->next=t->next;//原链表t处断开 else head=t->next; p=head; while(p!=0) { //同上,找出score最大的那个链 u=0; t=head; while(p->next!=0) { if(p->next->score>t->score) { t=p->next; u=p; } // if(p!=head)r=r->next; p=p->next; } s->next=t;//把找出的score最大的链接到新链表后 s=s->next; if(u!=0)u->next=t->next;//原链表t处断开 else head=t->next; // t=head; p=head; // r=head; } s->next=0;//新链表的结束标记 head=q;//head指向排序后链表的头 }
更加详细:
看完这个,估计你自己就可以实现了
C语言链表如何进行排序!
//排序( 参数为链表头 ) void Sorting( student* pHead ) { //参数判断(如果是空就返回) if ( pHead == NULL ) { return; } //临时变量..做冒泡循环用.. student* pTempA = pHead; student* pTempB = pHead; //这两个while相当于冒泡的嵌套for循环 while( pTempA != NULL ) { while ( pTempB != NULL ) { //判断结构体里面int类型(学号)大小 if ( pTempA->iNumiNum ) { //将结构体里int类型(学号)值进行交换 int Num = pTempA->iNum; pTempA->iNum = pTempB->iNum; pTempB->iNum = Num; //将char类型(名字)做交换 char Name[ 16 ]; strcpy ( Name, pTempA->strName ); strcpy ( pTempA->strName, pTempB->strName ); strcpy ( pTempB->strName, Name ); //因为指针变量不做交换...所以不做结构体的直接交换 //除了指向下一个结点的指针变量外所有的值进行交换 } //做链表遍历(相当于循环的i++) pTempB = pTempB->pNext; } //因为for每次进来i = 0; 这里while循环结束..要让pTempB重新回到头.. pTempB = pHead; //做链表遍历(相当于循环的i++) pTempA = pTempA->pNext; } } 连接晚上回来给你写...
单项链表排序
我在你的基础上给你改了个正确的,你看看,我下面说明了原因,另外你要是不是为了学习链表指针的操作,而是单单为了实现排序的话,你可以通过交换值的方式,而不用去改变指针,那样会简单很多//按score从大到小进行链表排序 void order() { t=head; p=head; // r=head;//head是原链表的头 u=0; //t指向链表中score最大的一个链 while(p->next!=0) { if(p->next->score >t->score) { t=p->next; u=p; } // if(p!=head)r=r->next;//r比p少前进一次,即r指向p前一格 p=p->next; } q=s=t;//q是排序后新链表的头 if(u!=0)u->next=t->next;//原链表t处断开 else head=t->next; p=head; while(p!=0) { //同上,找出score最大的那个链 u=0; t=head; while(p->next!=0) { if(p->next->score>t->score) { t=p->next; u=p; } // if(p!=head)r=r->next; p=p->next; } s->next=t;//把找出的score最大的链接到新链表后 s=s->next; if(u!=0)u->next=t->next;//原链表t处断开 else head=t->next; // t=head; p=head; // r=head; } s->next=0;//新链表的结束标记 head=q;//head指向排序后链表的头 } 你原来的如下:我在注释中说明一些原因,还有你的指针用的太多太乱,可读性很差,即便必须要用,也要起个有意义的名字,要不然很难读//按score从大到小进行链表排序 void order() { t=head; p=head; r=head;//head是原链表的头 //t指向链表中score最大的一个链 while(p->next!=0) //此处判断的p->next是否为空,假如为空,但是你p还没进行比较呢呀,所以这样写丢了最后一个元素了(因为你下面比较的是p,而不是p->next的score) { if(p->score>t->score) { t=p; u=r; } if(p!=head)r=r->next;//r比p少前进一次,即r指向p前一格 p=p->next; } q=s=t;//q是排序后新链表的头 //该处u没有促使值,加入上面的if语句始终不成立,那u=r; 执行不到,此处u肯定不为head了,但它不一定指向谁呢,所以u->next就出现暴力访问的错误了 if(u!=head)u->next=t->next;//原链表t处断开 else head=t->next; p=head; while(p->next!=0) { //同上,找出score最大的那个链 while(p->next!=0) { if(p->score>t->score) //t在内循环没有被促使化,直接使用很危险 { t=p; u=r; } if(p!=head)r=r->next; p=p->next; } s->next=t;//把找出的score最大的链接到新链表后 s=s->next; if(u!=head)u->next=t->next;//原链表t处断开 //同上 else head=t->next; t=head; p=head; r=head; } s->next=0;//新链表的结束标记 head=q;//head指向排序后链表的头 }
C语言单向链表排序如何实现
struct student* printf_sort(struct student *head)
{
struct student *p1,*p2,*ptemp,*pfinished=NULL;
for(p1=head;p1->next!=pfinished;)//对链表进行从大到小排序(这里用冒泡法)
//p1使之总是指向头结点,pfinished使之总是指向已排序好的最前面的结点
//ptemp作为中介,保存p2的上一个结点
{
for(p2=p1;p2->next!=pfinished;)
{
if(p2->num
if(p2==p1)//头结点要交换
{
p1=p2->next;
p2->next=p1->next;
p1->next=p2;
ptemp=p1;
}
else
{
ptemp->next=p2->next;
ptemp=p2->next;
p2->next=ptemp->next;
ptemp->next=p2;
}
}
else//不需要交换,则p2、ptemp前进1位
{
ptemp=p2;
p2=p2->next;
}
}
pfinished=p2;
}
}
以下为关联文档:
C语言链表操作包括链表的创建删除添加和释放操作!! #include#includestruct node *create(); void print_list(struct node *head); struct node * insert_node(struct node *h,int x,int y...
C语言冒泡排序法是怎么排序的C语言冒泡排序法的排2113序规则:5261 将被排序的记录4102数组R[1..n]垂直排列,每个记录R看作是重量为R.key的气泡1653。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡...
选择排序冒泡排序 C语言从程序运行需要的时间和储存空间来看,这两个吧,选择排序用的时间较少。我给你举个例子,这是一个比较直观的例子: 有十个数:10,9,8,7,6,5,4,3,2,1 。将他们按从小到大的顺序排成一...
帮忙做道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语言课程设计双向链表排序#includetypedef struct Link/*双向链表结构体*/{ int data; struct Link *lift; struct Link *right;}linkx,*linky;linky Init();/*建立双向链表*/void PrLink(linky p);/*输...
关于C语言单向链表SLIST *creatlist(int *a){ SLIST *h,*p,*q; int i;h=p=(SLIST *)malloc(sizeof(SLIST));for(i=0; i<N; i++){ q=(SLIST *)malloc(sizeof(SLIST));q->data=a[i]; p->next=q;...
链表的问题 C语言#include <stdio.h>;/*供参考*/ #include <malloc.h> #include <string.h> #define NULL 0 #define LEN sizeof(struct linkman) struct linkman //联系人结构体 { char na...
C语言链表问题我给你改,留个联系方式好给你。现在公司活比较忙。 给你改了一下,感觉你的链表好象设计的时候就有问题 你看看我给你改的吧. #include#include #define NULL 0 #define LEN si...