首页 新闻 会员 周边 捐助

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

0
悬赏园豆:20 [已解决问题] 解决于 2014-03-25 14:23

//建一个简单的队列,(对它进行按关键字排序,查找,)增加结点和删除结点
#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的主页 zhengzhiqiang | 初学一级 | 园豆:12
提问于:2014-03-17 14:39
< >
分享
最佳答案
0

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

zhengzhiqiang | 初学一级 |园豆:12 | 2014-03-23 12:19
其他回答(1)
0

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

你这么做是图什么?

你的机构体是能实现队列的,当时一般要有一个头指针和一个尾指针,1个入队函数1个出队函数,像你这样输出还需要一个遍历函数

收获园豆:20
吴瑞祥 | 园豆:29449 (高人七级) | 2014-03-17 16:52

我是初学者不太会用链表,但我觉得好像用n不就不需要尾指针了,对吗?,那请问遍历该咋弄,是不是遍历好了就行啦这程序?谢谢

支持(0) 反对(0) zhengzhiqiang | 园豆:12 (初学一级) | 2014-03-18 11:21

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

链表遍历就是一个while循环,循环条件就是当前节点为null,

而且你要写一个程序首先你要确定一下需求,我现在不知道你的需求,所以也就不知道你这程序行不行

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-03-18 12:24

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

支持(0) 反对(0) zhengzhiqiang | 园豆:12 (初学一级) | 2014-03-18 17:13

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

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-03-18 17:20

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

支持(0) 反对(0) zhengzhiqiang | 园豆:12 (初学一级) | 2014-03-18 17:31

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

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

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-03-18 17:44

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

再问下,下面这什么时候需要重新申请,谢啦

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

支持(0) 反对(0) zhengzhiqiang | 园豆:12 (初学一级) | 2014-03-18 17:56

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

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-03-18 18:23

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

支持(0) 反对(0) zhengzhiqiang | 园豆:12 (初学一级) | 2014-03-18 21:32

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

问题不是出在这句是出在front=node;你这一句又把前面申请的空间给丢弃了.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-03-19 09:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册