首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个链表的程序

2012-08-19 
求助一个链表的程序。C/C++ code#include stdio.h#include stdlib.h#include time.h#define M 6 //

求助一个链表的程序。

C/C++ code
#include <stdio.h>#include <stdlib.h>#include <time.h>#define M 6 // 链表的长度// 定义链表结点typedef struct node{int data;struct node *next;}Node, *Nodeptr;//创建链表Nodeptr CreatLink(){Nodeptr l, p, q;int j;l=(Nodeptr)malloc(sizeof(Node));l->next=NULL;q=l;for(j=1;j<=M;j++){p=(Nodeptr)malloc(sizeof(Node));p->data=rand()%100;q->next=p;q=p; }q->next=NULL;return (l);}// 输出链表void OutPut(Nodeptr l){Nodeptr p;p=l->next;while(p!=NULL){printf("%d ",p->data);p=p->next;}printf("\n");}// 用选择排序法对链表排序void SelectSort(Nodeptr l){Nodeptr p, q, r;int t;for(p=l->next;p->next !=NULL;p=p->next){r=p;for(q=p->next;q!=NULL;q=q->next)if(q->data < p->data)r=q;if(r!=p){t=p->data;p->data=r->data;r->data=t;}}}void main(){Nodeptr t;srand((unsigned)time(NULL));  t=CreatLink();      printf("链表在排序之前输出为:\n");OutPut(t);  printf("\n");SelectSort(t);printf("链表排好序后输出为:\n");  OutPut(t);


程序不能得到排序的目的,请高手们给修改指点一下,谢谢了!

[解决办法]
这种单步调试应该很快能找到问题吧
要学会自己调试程序
[解决办法]
很多时候程序都是自己慢慢跳出来的,,我以前连接数据库的时候多一个空格找了3个小时,,努力吧
[解决办法]
你的选择法排序那有错误,每次都跟p比较,p又没变化,应该跟r比较,我帮你改了下,你看看吧:

// 用选择排序法对链表排序
void SelectSort(Nodeptr l)
{
Nodeptr p, q, r;
int t;
for(p=l->next;p->next !=NULL;p=p->next)
{
r=p;
for(q=p->next;q!=NULL;q=q->next)
if(q->data < r->data)
r=q;
if(r!=p)
{
t=p->data;
p->data=r->data;
r->data=t;
}
}
}

void main()
{
Nodeptr t;
srand((unsigned)time(NULL));
t=CreatLink();

printf("链表在排序之前输出为:\n");
OutPut(t);
printf("\n");

SelectSort(t);

printf("链表排好序后输出为:\n");
OutPut(t);
getchar();
}
[解决办法]
选择法排序的内部循环出了问题啊,应该将if(q->data < p->data);
改为if(q->data < r->data); 多调试,多写程序,多总结,努力吧。


[解决办法]
应该将if(q->data < p->data);
改为if(q->data < r->data);
循环中的判断很容易出问题的,要谨慎处理,而且,你malloc了那么多节点,最后一个都没释放。。。习惯不好。
[解决办法]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define M 6 // 链表的长度

// 定义链表结点
typedef struct node
{
int data;
struct node *next;
}Node, *Nodeptr;

//创建链表
Nodeptr CreatLink()
{
Nodeptr l, p, q;
int j;
l=(Nodeptr)malloc(sizeof(Node));
l=NULL;

for(j=1;j<=M;j++)
{
p=(Nodeptr)malloc(sizeof(Node));
p->data=rand()%100;
p->next=l;
l=p;
}


return (l);
}

// 输出链表
void OutPut(Nodeptr l)
{
Nodeptr p;
p=l->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}

// 用选择排序法对链表排序
void SelectSort(Nodeptr l)
{
Nodeptr p, q, r;
int t;
for(p=l->next;p->next !=NULL;p=p->next)
{
r=p;
for(q=p->next;q!=NULL;q=q->next)
if(q->data < r->data)
r=q;
if(r!=p)
{
t=p->data;
p->data=r->data;
r->data=t;


}
}
}

void main()
{
Nodeptr t;
srand((unsigned)time(NULL));
t=CreatLink();

printf("链表在排序之前输出为:\n");
OutPut(t);
printf("\n");

SelectSort(t);

printf("链表排好序后输出为:\n");
OutPut(t);
}



我给你简化了一下

热点排行