C语言链表按序号排序问题。结果一直出不来,是电脑反应太慢还是我写的哪里有问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言链表按序号排序问题。结果一直出不来,是电脑反应太慢还是我写的哪里有问题相关的知识,希望对你有一定的参考价值。
#include<stdio.h>
#include<stdlib.h>
struct studen
int num;
char name[20];
struct studen *next;
;
int main()
struct studen *head;
struct studen *creat();
struct studen *paixu(struct studen *head);
void prin(struct studen *);
head=creat();
head=paixu(head);
prin(head);
system("pause");
struct studen *creat()
struct studen *head,*p1,*p2;
int n=0;
p1=p2=(struct studen *)malloc(sizeof(struct studen));
head=NULL;
printf("请输入学号,学生名\n");
scanf("%d%s",&p1->num,p1->name);
while(p1->num!=0)
n++;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct studen *)malloc(sizeof(struct studen));
printf("请输入学号,学生名。输入0停止\n");
scanf("%d%s",&p1->num,p1->name);
p2->next=NULL;
return (head);
void prin(struct studen *head)
struct studen *p=head;
if(head==NULL)return ;
else while(p!=NULL)
printf("学号为%d\t学生名为%s\n",p->num,p->name);
p=p->next;
return;
struct studen *paixu(struct studen *head)
int i,l=0;
struct studen *p,*k,*kk=head,*pp,*chan,*ll;
p=head;
while(p!=NULL)
pp=p->next;l++;i=p->num;
for(k=pp;k!=NULL;k=k->next)
if((k->num)<(p->num))i=k->num;
if(i!=p->num)
for(k=pp;k->next->num!=i;k=k->next);
ll=k->next;
chan=k->next;
k->next=kk->next;
kk->next=chan;
k=ll;
chan=k->next;
k->next=p->next;
p->next=chan;
kk=p;
p=pp;
return (head);
对于链表排序,采用插入法要好些。
给你写出来吧:
struct studen *paixu(struct studen *head)
int i,l=0;
struct studen *p,*q,*t,*pt;
if(head==NULL)
return head;
p=head->next;
head->next=NULL;
while(p!=NULL)
/* 摘下p结点 */
q=p;
p=p->next;
q->next=NULL;
/* q结点插到head链中 */
/* 寻找插入位置 */
for(pt=NULL,t=head; t!=NULL && t->num < q->num; pt=t,t=t->next);
if(pt==NULL)/* 在首部插入 */
q->next=head, head=q;
else if(t==NULL)/* 在尾部插入 */
pt->next=q;
else /* 在中间插入 */
q->next=pt->next, pt->next=q;
return (head);
追问
head ->next已经设为NULL
那后面
for(pt=NULL,t=head; t!=NULL && t->num num; pt=t,t=t->next);
t=t->next这是空的
p=head->next;
head->next=NULL;
这是把待排序的链表首结点摘下来,作为插入到有序链表(还是用head指向)第一个结点
for(pt=NULL,t=head; t!=NULL && t->num num; pt=t,t=t->next);
这是 在head所指的有序链表中寻找q所指结点的插入位置
//p2 没有把值赋值给head返回出去
struct studen *creat()
struct studen *head,*p1,*p2;
int n=0;
p1=p2=(struct studen *)malloc(sizeof(struct studen));
head=NULL;
printf("请输入学号,学生名\n");
scanf("%d %s",&p1->num,&p1->name);
while(p1->num!=0)
n++;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct studen *)malloc(sizeof(struct studen));
printf("请输入学号,学生名。输入0停止\n");
scanf("%d%s",&p1->num,p1->name);
p2->next=NULL;
//p2 没有把值赋值给head返回出去
return (head);
参考技术B 不打断点调试么?追问
怎么弄
以上是关于C语言链表按序号排序问题。结果一直出不来,是电脑反应太慢还是我写的哪里有问题的主要内容,如果未能解决你的问题,请参考以下文章