最进在学习链表,中间遇到一些问题,现在把他们写在这里,以防自己再犯类的的错误,让自己更好的掌握链表(可能有些东西读了不是很懂,这是因为有些错误我是特定的环境下犯的,而这个环境我没有很好的描述出来,所以有些结束写的有点让人摸不到头脑,这是我个人的原因,望见谅)
在使用链表时,一件肯定要做的事情就是创建链表,我在树上看到的一种创建方法如下:
#include
#include
#include
#define PT "学号: %ld 姓名:%-10s 成绩:%6.1f\n",p->num ,p->name,p->score
#define N sizeof(struct stud)
struct stud{
long num;
char name[11];
float score ;
struct stud *next ;
};
void print(struct stud *p)
{
p=p->next;
while (p!=NULL){
printf(PT);
p=p->next;
}
}
struct stud *creat (void){
struct stud *p1,*p2,*head ;
head=p2=(struct stud*)malloc(N);
printf("请输入学号: 姓名: 成绩(学号输入0结束)\n");
p1 = (struct stud*)malloc(N);
scanf("%ld%s%f",&p1->num,p1->name,&p1->score);
while(p1->num != 0){
p2->next = p1;
p2=p1;
p1=(struct stud *)malloc(N);
scanf("%ld%s%f",&p1->num,p1->name,&p1->score);
}
p2->next = NULL;
free(p1);
return head;
}
void main()
{
struct stud *head;
head = creat();
print(head);
}
很显然这段代码很简单,这个创建的链表有一个头指针,但是头指指向的第一个节点data区并没有存储数据,就是说第一个节点只有第 next 是有用的,现在我想用上第一个节点的 data区,但大的循环结构又不会有太大的改变,后来我重写了creat函数,就是下面的mycreat函数:
struct stud *mycreat(void)
{
struct stud *head,*prsn,*pnew;
head=prsn=(struct stud * )malloc(N);
printf("请输入学号: 姓名: 成绩(学号输入0结束)\n");
scanf("%ld%s%f",&prsn->num,prsn->name,&prsn->score);
if(prsn->num != 0){
pnew=(struct stud *)malloc(N);
scanf("%ld%s%f",&pnew->num,pnew->name,&pnew->score);
while(pnew->num!= 0){
prsn->next=pnew;
prsn=pnew;
pnew=(struct stud *)malloc(N);
scanf("%ld%s%f",&pnew->num,pnew->name,&pnew->score);
}
prsn->next=NULL;
}
return head;
}
现在就能用上第一个节点的数据区了,但现在的这短代码于原来的相比较就显得结构有点复杂,不知道哪种结构更好?
还有,在创建链表的时候发现由于在你创建完一个链表后,你总要将最后一个节点的 next 只想NULL,这样的话总要保留一个指针变量(就是上面的prsn )因为最后的赋值为 prsn->next = NULL ,这样就要求在创建链表的时候最好有3个指针,一个指向头节点,一个指向当前的节点了,一个指向新创建的节点。
阅读(1049) | 评论(0) | 转发(0) |