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

问题描述

一个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:ttNumber:n");
while(p){
printf("%stt%dn",p->name,p->number);
p=p->next;}
}

时间: 2024-09-12 01:52:19

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

C语言单向链表的表示与实现实例详解_C 语言

1.概述: C语言中的单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链表中最简单的一种是单向链表,它包含两个域,一个信息域和一个指针域.这个链接指向列表中的下一个节点,而最后一个节点则指向一个空值. 如下图所示: 一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接 一个单向链表的节点被分成两个部分.第一个部分保存或者显示关于节点的信息,第二个部分存储下一个节点的地址.单向链表只可向一个方向遍历. 链表最基本的结构是在每个节点

一个c语言的链表问题,总是产生垃圾值,好几个指针错误找不到。

问题描述 一个c语言的链表问题,总是产生垃圾值,好几个指针错误找不到. #include #include typedef int ElemType; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; typedef int Status; Status ListInsert_L(LinkList *L,int i,ElemType e) { LinkList p,s; int j=0; p=*L

单链表-c语言单向链表的问题???

问题描述 c语言单向链表的问题??? #include<stdio.h>#include<stdlib.h>struct node{ int num; struct node *next;};//构建空的链表struct node* InitList(struct node *L){ L = (struct node*)malloc(sizeof(struct node)); L = NULL; printf_s(""InitList sucess!"

C语言实现一个简单的单向链表list

用C语言实现一个简单实用的单向链表list,具有一定的实际意义.尤其我们不想使用STL里面的list<...>类的时候.我实现的这个list,结点存储任何调用者分配的任意类型的数据(void*).这个list适用于一些简单的场合,消耗极少的资源. 头文件: /* * list.h * Generic sequential linked list node structure -- can hold any type data. * cheungmine * Sep. 22, 2007. All

C语言之单向链表详解及实例代码_C 语言

1,单向链简洁. 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指针成员变量指列表中的下一个结点:列表是由结点构成,由head指针指向第一个成为表头的结点而终止于最后一个指向nuLL的指针: 2,例子要求: 根据示例代码中的例子,完成单向链表(single linked list)中的以字符串为数据的链表的插入.删除以及查找,并支持单向链表的反转

C语言解字符串逆序和单向链表逆序问题的代码示例_C 语言

字符串逆序上次面试碰到一个单向链表逆序的题目,幸好对字符串逆序比较熟悉,类比做出来了.字符串逆序比较简单,直接上代码: void stringReverse(char* p1,char* p2) { if(p1==p2)return; //swap the value of p1 ,p2 *p1=(*p1)+(*p2); *p2=(*p1)-(*p2); *p1=(*p1)-(*p2); if(p1==p2-1)return; else stringReverse(++p1,--p2); } 调

《21天学通C语言(第6版•修订版)》一1.5 第一个C语言程序

1.5 第一个C语言程序 21天学通C语言(第6版•修订版)读者也许迫不及待地想编写第一个C语言程序.为帮助读者熟悉编译器,程序清单1.1包含一个小型程序,功能快速地完成.现在,读者也许无法理解其中的所有内容,但不用担心,尽管编写.编译并运行它. 这里的演示使用的是一个名为hello.c的程序,该程序只是将单词"Hello, World!"显示到屏幕上而已.该程序常被用来介绍C语言编程,很适合读者进行学习.程序清单1.1列出了hello.c的源代码.输入该程序清单时,请不要输入最左边的

c语言-反转单向链表,C语言,运行出错

问题描述 反转单向链表,C语言,运行出错 #include #include /* run this program using the console pauser or add your own getch, system("pause") or input loop */ typedef struct LNode{ int node; struct LNode *next; } LNode,*LinkList; LinkList Head_Node() { LinkList he

数据-一个c语言解密的问题运行没结果

问题描述 一个c语言解密的问题运行没结果 一个解密的程序,运行的时候没有结果,错误,编译没有错误 #include #include char jiemi(char a[])//吧所有字母都向前移动5位,得出明文 { int i=0; while(a[i]!='') { if(a[i]==','||a[i]==' ') { i++; } else { a[i]=a[i]-5; i++; } } return 0; } int main()//遇到start开始输入数据,遇到end 打印数据 //