2 jfkud 1 jfkud_1 于 2013.10.31 22:31 提问

一个c语言单向链表,编译通过,运行结果却不知所谓,请求帮助

这段代码在rhel6中用gcc编译通过,运行结果未定义,其中作的链表按number大小排序打印出来是没有排过序的结果,而且输入记录多了,其中某些项的number打印出来会由输入的值变成0或者一个莫名其妙的整数.
vs2008中编译通过,打入多项记录只能显示2条,而且前一条是乱码.
最简单的一个数据结构,却忙了半天还查不出原因,帮个忙吧-_-|||

原代码:
/*简单单向链表,输入学生名称和号码,按号码排序,

  • 如果号码相同则记录合并为一条,附输出函数*/ #include #include #include #include #define N 50 #define LEN (sizeof(student *))

static int n=0;//计数器

typedef struct student{
char name[N];
int number;
struct student *next;}student;//链表节点结构

int main()
{
student *add(student *head);//添加记录函数声明
void list(student *head);//列表函数声明
student *head=NULL;
while(1){
printf("'N/n' to add,'L/l' to list,other to exit:");
char ch=toupper(getchar());
getchar();
if(ch=='N')head=add(head);
else if(ch=='L')list(head);
else break;}
return 0;
}//主函数

student add(student *head){
student *p,*p1=head,*p2=head;
p=(student *)malloc(LEN);//分配一片空间
printf("Input name:");
gets(p->name);
printf("Input number:");
scanf("%d",&p->number);
scanf("%
[^\n]");
scanf("%*c");
if(p->number<=0){//如果输入号码<=0,直接返回
printf("Wrong number!!\n");
return head;}
else{
if(head==NULL){//如果表空直接接到头指针
head=p;
head->next=NULL;
n++;}
else{//表不空
//确定p1指向
while(p->number>p1->number&&p1->next!=NULL){
p2=p1;//p2保存p1指向下一节点之前的值
p1=p1->next;}
if(p->numbernumber){//插入表中的情况
p2->next=p;
p->next=p1;
n++}
//如果号相等,合并记录
else if(p->number==p1->number)strcpy(p1->name,p->name);
else if(p1->next==NULL){//输入新记录的号码比链表里所有都大的情况
p1->next=p;
p->next=NULL;
n++;}
}
}
return head;}

void list(student *head){//遍历打印函数
student *p=head;
printf("There's %d records!!\n",n);
printf("Name:\t\tNumber:\n");
while(p){
printf("%s\t\t%d\n",p->name,p->number);
p=p->next;}
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
将一个单向链表反向链接
        其实是一个很简单的题目,不过我用递归实现了一下,个人感觉写的挺漂亮的,于是就决定贴出来秀一下,呵呵,代码如下: //这是个公共函数,也就是你需要的接口public void reverse() ...{    Link temp = first;    reverselink(temp).next = null;}//这是个私有函数,为上面的公共函数服务private Li
C语言-------实现一个简单的单向链表
编写一个链表程序,在程序中实现简单的功能#include #include struct node{ int num; char name[20]; struct node* next; //指向下一个地址的指针 }; //声明一个链表,此时内存不分配内存 typedef struct node Node; //重命名,便于书写,太长了struct node ty
C语言单向链表的表示与实现实例详解
C语言单向链表的表示与实现实例详解
单向链表的建立(C语言)
貌似有段时间没有做原创文章了,聒噪的很,开始正式学习数据结构啦哈哈,今天先做单向链表的建立,希望和大家一起分享 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要30个大小的数组,有时需要50个数组的大小,难于统一。我们只能够根据可能的最大需求来
(C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
我学习了几天数据结构,今天下午自己写了一个单向链表的程序。我也是新手,所以刚开始学习数据结构的菜鸟们(有大牛们能屈尊uY3Nkbi5uZXQvZmlzaGVyd2Fu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity看一看,也是我的荣幸)可以和我一起共同学习、讨论,当然也很高兴能指出我的错误,因为这是我们一起成长的过程
C语言实现单向链表的创建、插入,删除节点,和2个链表合并
VC6.0下 用C语言实现单向链表的创建、插入,删除节点,和2个链表合并等操作
C语言单向链表的实现
一个简单结点的结构体表示为:    struct note    {       int  data;              /*数据成员可以是多个不同类型的数据*/       struct  note  *next;      /*指针变量成员只能是-个*/    };  一个简单的单向链表的图示 1.链表是结构、指针相结合的-种应用,它是由头、中间、尾多个链环组成的单方向可伸缩的链表,链
C语言 从编写代码到得到执行结果步骤
下面是从课本上抄下来的: C语言程序从编写代码到执行结果步骤: 一般需要六步: 1.编辑 2.预处理(可以忽略) 3.编译 4.链接 5.装载(可以忽略) 6.运行 下面详细说明: 步骤1:编辑     编辑就是将编写好的C语言程序通过输入设备录入到计算机中,生成拓展名为".c"的源文件。 步骤2:预处理     执行程序中的预处理命令(预处理命令是为了优化代码而设计
单向链表的C语言实现
C语言指针实现单向链表 初学者看,非常简单。 时间非常多的功能不同位置的插入、删除、查找;
C语言实现链表之单向链表(四)清空链表
C语言实现链表之单向链表(四)清空链表     上一篇文章给出了创建链表的函数,本篇文章将给出清空链表的函数,程序如下。 /*============================================================================== * 操作 :清空链表,释放结点内存,将链表重置为空表 * 操作前:ppHeadNod