# 队列链表增加结点显示错误两种显示方法对比，要不中间数据没了，要不新加不显示不出来，求高手指导

0

//建一个简单的队列，(对它进行按关键字排序，查找，)增加结点和删除结点
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct StudentNode)
#define MAXSIZE 6//队列总长度
struct StudentNode
{
long num;
float score;
struct StudentNode * next;
};
int n;//当前队列人数
//创建队列链表
struct StudentNode*creat(void)
{
struct StudentNode * node1,* node2;
struct StudentNode * front;//队头
node1=node2=(struct StudentNode * )malloc(LEN);
front=NULL;
n=0;
scanf("%ld,%f",&node1->num ,&node1->score);
while(node1->num!=0)//num输入0结束队列
{
n=n+1;
if(n==1)
{
front=node1;
}
else
{
node2->next=node1;
}
node2=node1;
node1=(struct StudentNode * )malloc(LEN);
scanf("%ld,%f",&node1->num ,&node1->score);
}
node1->next=NULL;
return front;
};
//增加结点（插入一个元素到队尾）
struct StudentNode*Enter(struct StudentNode * node,long num,float score)
{
if(n==MAXSIZE)//队列已满
{
printf("Student Is Full\n");
}
struct StudentNode * front;
front=(struct StudentNode * )malloc(LEN);
front=node;
(front+n)->num=num;
(front+n)->score=score;
(front+n)->next=NULL;
n=n+1;
return front;
};
//删除结点（删除队头的一个元素）
struct StudentNode*Delete(struct StudentNode * node)
{
if(n==0)//空队列
{
printf("Student Is Empty");
}
struct StudentNode * front;
front=(struct StudentNode * )malloc(LEN);
front=node;
node=node->next;
return node;
}
//显示链表1
void print1(struct StudentNode * p)
{
struct StudentNode * Node;
Node=p;
if(Node!=NULL)
do
{
printf("\nnum:%ld\nscore:%5.1f\n",Node->num,Node->score);
Node=Node->next;
}while(Node!=NULL);
}
//显示链表2
void print2(struct StudentNode * p)
{
struct StudentNode * Node;
Node=p;
printf("\nnum:%ld\nscore:%5.1f\n",(Node)->num,(Node)->score);
printf("\nnum:%ld\nscore:%5.1f\n",(Node+1)->num,(Node+1)->score);
printf("\nnum:%ld\nscore:%5.1f\n",(Node+2)->num,(Node+2)->score);
}
int main()
{
struct StudentNode * p;
p=creat();
p=Enter(p,1001,98);
//p=Delete(p);
printf("%d",n);
print1(p);
//print2(p);
return 0;
};

zhengzhiqiang | 初学一级 | 园豆：12

0

zhengzhiqiang | 初学一级 |园豆：12 | 2014-03-23 12:19

0

struct StudentNode*Enter(struct StudentNode * node,long num,float score)
{
front=(struct StudentNode * )malloc(LEN);
front=node;

@zhengzhiqiang: 因为你要实现队列,所以最好有个尾指针,好出队.要是你要实现堆栈,那一个头指针就够了

@吴瑞祥: 我的显示2不算是遍历吗，但结果不对？？？

@zhengzhiqiang: 你这个显示2怎么能算是遍历```你往下走了3层,要是这个链表长度为2,直接就异常了.要是长度为4就有1个元素被漏掉了.你结果不对的原因,我第一个回复里说的那个就是一个原因,其它有没有还没看出来,你先改了看看

@吴瑞祥: 显示1 说错了，显示2是我来对比用的，所以就只弄3层；就不知道为什么显示2输得出数来，而显示1的遍历输不出数来

@zhengzhiqiang: 首先你这第一个问题是Enter函数,

front=(struct StudentNode * )malloc(LEN);申请内存,
front=node;前面申请的内存就没掉了

@吴瑞祥: 哦哦，我知道了，链表里数据地址是随机的，不是连续的，所以显示2的结果不对，必须用遍历的方法输出。那么这样enter也不能那样赋值，得通过尾指针指向新加入的值。应该是这样的吧？

front=(struct StudentNode * )malloc(LEN);申请内存,
front=node;前面申请的内存就没掉了

@zhengzhiqiang: 你要添加一个节点的时候,就需要申请一个结构体内存,然后让列表尾节点的next指针指向这个新申请的空间

@吴瑞祥: 那按你这么说enter这不就是要添加一个节点，到底要不要front=(struct StudentNode * )malloc(LEN);

@zhengzhiqiang: ``就是说要front=(struct StudentNode * )malloc(LEN);

您需要登录以后才能回答，未注册用户请先注册