//建一个简单的队列,(对它进行按关键字排序,查找,)增加结点和删除结点
#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;
};
我知道了,链表里数据地址是随机的,不是连续的,所以显示2的结果不对,必须用遍历的方法输出。那么这样enter也不能那样赋值,得通过尾指针指向新加入的值
struct StudentNode*Enter(struct StudentNode * node,long num,float score)
{
front=(struct StudentNode * )malloc(LEN);
front=node;
你这么做是图什么?
你的机构体是能实现队列的,当时一般要有一个头指针和一个尾指针,1个入队函数1个出队函数,像你这样输出还需要一个遍历函数
我是初学者不太会用链表,但我觉得好像用n不就不需要尾指针了,对吗?,那请问遍历该咋弄,是不是遍历好了就行啦这程序?谢谢
@zhengzhiqiang: 因为你要实现队列,所以最好有个尾指针,好出队.要是你要实现堆栈,那一个头指针就够了
链表遍历就是一个while循环,循环条件就是当前节点为null,
而且你要写一个程序首先你要确定一下需求,我现在不知道你的需求,所以也就不知道你这程序行不行
@吴瑞祥: 我的显示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);
问题不是出在这句是出在front=node;你这一句又把前面申请的空间给丢弃了.