简单的动态链表

题目:用动态链表输入三个学生的学号和成绩,并输出第一位学生的信息(c语言程序设计P313)
#include
#include
#define LEN sizeof(struct student)
struct student
 {
 	long num;
 	float score;
 	struct student * next;//这里是指向结构体的指针,同时其也是结构体的一部分。对于新建的空间
                                p->next是一个指针还没有赋值
 };
int n=3;// 要输入的学生数
int i;
struct student * creat(void)
{
	struct student *head,*p1;
	i=1;
	p1=(struct student *)malloc(LEN);
	head=(struct student *)malloc(LEN);
	scanf("%ld,%f",&p1->num,&p1->score);
	while(i<=n)
	{
		p1->next=(struct student*)malloc(LEN);//建立连接,pl->next是结构体的一部分
                pl=pl->next;//注意这一步和上一步的先后关系,pl只是变量
               scanf("%ld,%f",&p1->num,&p1->score);
		i++;
	}
	p1->next=NULL;
 } 
int main()
{
	struct student *pt;
	pt=creat();
	printf("\nnum:%ld\nscore:%5.1f\n",pt->num,pt->score);
}
 //从头到尾没有使用free(),很是不好,以后再加。

上面啥玩意,我都忘了,还有这茬。

动态链表的建立:

第一种会多出个空间,为不正确的建立方式:

head=(node *)malloc(sizeof(node));
	 
	/*p=(node *)malloc(sizeof(node));//这样写每次建立链表后,都会多出 
	head->next=p;                   //一个空间,对循环的判断也有影响 
	p->next=NULL;
	for(i=0;ielem);
		p->next=(node *)malloc(sizeof(node));
		p=p->next;
		p->next=NULL;
	}*/

第二种是在第一种的情况下做的改进:既然多出个空间,则最后一次不进行空间的开辟。

node *write()
{
	int i,n;
	node *head,*p; 
	printf("输入链表长度:");
	scanf("%d",&n);
	printf("输入元素:");
	head=(node *)malloc(sizeof(node));
	 
	/*p=(node *)malloc(sizeof(node));//这样写每次建立链表后,都会多出 
	head->next=p;                   //一个空间,对循环的判断也有影响 
	p->next=NULL;
	for(i=0;ielem);
		p->next=(node *)malloc(sizeof(node));
		p=p->next;
		p->next=NULL;
	}*/
	
	p=(node *)malloc(sizeof(node)); 
	head->next=p;                   
	for(i=0;ielem);
		if(i<=n-2)//最后一个不需要再次开辟空间,但是每次都需要判断 
		{         //能否在保证与头链表连接的同时,不需要每次判断 
			p->next=(node *)malloc(sizeof(node));
			p=p->next;
		}	
	}
	p->next=NULL;//这步很重要 
	return head;
}
第三种是目前推荐使用的。第二种每次都要进行判断,不是很好。下面这种需要从空间上进行理解。

就像同一个人有不同的名字,某个名字对应的人做出改变,即是人做出了改变。

node *write()
{
	int temp;
	node *head,*p,*q;
	head=(node *)malloc(sizeof(node));
	p=head;//这里给头结点起了别名,保存头结点的同时,将头结点与后面链表相连 
	scanf("%d",&temp);
	while(temp!=-1)//以-1作为结束符号
	{
		p->next=(node *)malloc(sizeof(node));//需要一个节点,再开辟一个空间 
		p=p->next; 
		p->elem=temp;
		scanf("%d",&temp);	 
	}
	p->next=NULL;//头文件已将NULL定义为0  
	return head; 
}






你可能感兴趣的:(数据结构)