码迷,mamicode.com
首页 > 其他好文 > 详细

通过结构体,建立动态链表,并输出链表

时间:2015-06-03 17:54:55      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

/*****************
*
通过结构体,建立动态链表,并输出链表。
*
*******************/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define LEN sizeof(struct student)  //宏定义 将LEN 替换为student 结构体的大小数值

struct student *create();  //声明创建新链表(节点)(结构体)函数,返回该链表的头地址(指针),(尾部添加节点方法)

void print(struct student *head); // 打印链表函数(此处为函数声明,
                                 //print函数()内的形参可有可无,有则主要给编程人员看的)

struct student     //定义结构体类型,即每个创建的节点(结构体)内包含什么类型的数据

{
 long num;
 float score;
 struct student *next;  //用来连接下一个结构体的指针
};

int n; //全局变量,用来记录创建了多少个结构体

void main()
{
 struct student *stu; //定义一个指针类型的结构体stu
 stu = create(); //调用创建新节点(结构体)函数create()并将其创建成的链表头地址(指针)赋给stu指针
 print(stu); //用create()返回的指针作实参调用函数print()
 printf("\n\n");
 system("pause");  //此处system函数()内带双引号,中文的任意键退出提示
}

struct student *create()  //定义创捷指针结构体的函数
{
 struct student *head; // 定义指针结构体变量*head, *p1,*p2,用于存放新创建的指针结构体
 struct student *p1,*p2;
 p1 = p2 = (struct student *)malloc(LEN); //LEN是student结构体的大小
                //用动态内存分配函数malloc()分配内存给指针结构体p1和p2
 printf("please enter the num : "); //指针结构体p1先获得数据
 scanf("%ld",&p1->num);
 printf("please enter the score : ");
 scanf("%f",&p2->score);
 head = NULL;  //定义头指针为空值
 n = 0;    //初始话计数器
 
 while(p1->num) //判断指针结构体p1成员所获得的数据是否为0,否时(即表示p1获取数据成功)则继续一下执行
 {
  n++;  // 节点创建记数器+1
  if(1==n)  //当创建的为第一节点时,
  {
   head = p1; //将指针结构体p1的首地址赋给指针接头体head(即让头指针结构体指向p1)
  }
  else  //若是第一个之后创建的指针接头体
  {
   p2->next = p1; //将p2指针结构体尾地址指向指针结构体p1首地址
  }
  p2 = p1; //让p2指向p1,为后续p1的从新获取数据步骤作备份
  p1 = (struct student *)malloc(LEN); //再次使用动态内存分配函数给p1指针结构体分配特定的内存空间(此时即为再次创建新节点(指针结构体))

  printf("\nPlease enter the num :");  //新指针结构体p1获得数据
  scanf("%d",&p1->num);
  printf("\nPlease enter the score :");
  scanf("%f",&p1->score);
 }  
 p2->next = NULL;  //当循环不执行(即p1->num,获得0值时) 将p2指针结构体成员 p2->next指向NULL即0,表示链表的结束

 return head;  //函数struct student *create() 返回链表的头地址。
}

void print(struct student *head)  //定义print函数,接收链表头地址(实参),执行运行,此处的形参(类型和名称)必须要有
{
      struct student *p;   // 定义一个新的指针结构体变量p
      printf("\nThere are %d records!\n\n", n);
      p = head;  //所定义的新的p是用于接收函数struct student *create()返回回来的链表头地址,此地址在print函数内用head这个指针来传递
      if( p )  //判断链表的头地址是否为空,(即有没有创建一个新的节点(指针结构体))
      {        
            do
            {
                  printf("学号为 %d 的成绩是: %f\n", p->num, p->score);//注意指针结构体的成员引用格式:指针结构体名->成员名;
         //将头地址(指针接头体struct student *head) 的成员打印出来

                  p = p->next;  //将头地址(指针接头体struct student *head) 指向下一节点头地址。
                               //尾成员存放的地址(p->next内的地址即为下一个节点(指针结构体)的头地址)

            }while( p ); //直到p值为NULL,(即0),退出循环。

      }

}

通过结构体,建立动态链表,并输出链表

标签:

原文地址:http://my.oschina.net/u/2379244/blog/424341

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!