//
// main.c
// dynamic_link_list
//
// Created by ma c on 15/8/5.
// Copyright (c) 2015. All rights reserved.
// 要求:写一个函数建立有3名学生数据的动态单向链表,并输出链表中每个结点的所有内容。
/*
建立动态链表的思想:
1、开辟一个新结点,并使p1,p2指向它;
2、读入一个学生数据给p1所指的结点;
3、head = NULL,n = 0;
4、判断读入的p1->num是否为0。
如果p1->num!=0,n = n+1;此时n==1?
如果n==1,head=p1(p1所指的结点作为第一个结点)
如果n!=1,p2->next=p1(把p1所指的结点连接到表尾)
p2=p1;(p2移到表尾)
再开辟一个新结点,使p1指向它;
读入一个学生数据给p1所指接点;
表尾结点的指针变量置NULL。
如果p1->num==0,链表结束,退出程序。
输出链表的思想:
1、p=head,使p指向第一个结点
2、判断p指向的是不是尾节点?
如果不是,输出p所指向的结点,p指向下一个结点;
如果是,链表结束,退出程序。
*/
#include <stdio.h>
#include<stdlib.h>
#define LEN sizeof(Student)
typedef struct student
{
int num;
float socre;
struct student *next;
}Student;
int n; //定义一个全局变量
Student *createlist(void)
{
Student *p1,*p2,*head;
int n = 0;
//开辟一个新单元
p1 = p2 = (Student*)malloc(LEN);
//输入第一个学生的学号和成绩
scanf("%d,%f",&p1->num,&p1->socre);
head = NULL;
while(p1->num!=0)
{
n = n+1;
if(n==1)
{
head = p1;
}
else
{
p2->next = p1;
}
p2 = p1;
p1 = (Student *)malloc(LEN);
scanf("%d,%f",&p1->num,&p1->socre);
}
p2->next = NULL;
return head;
}
void printlink(Student *pt)
{
while(pt!=NULL)
{
printf("\nnum:%d\nscore:%5.1f\n",pt->num,pt->socre);//输出每个结点的成员值
pt = pt->next;
}
}
int main(int argc, const char * argv[])
{
Student *pt;
pt = createlist();//函数返回链表的第一个结点的地址
printlink(pt);
return 0;
}