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

/*****************
*
通过结构体,建立动态链表,并输出链表。
*
*******************/
#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),退出循环。

      }

}
时间: 2024-12-16 14:37:25

通过结构体,建立动态链表,并输出链表的相关文章

c语言:通过指向结构体变量的指针变量输出结构体变量中成员的信息

通过指向结构体变量的指针变量输出结构体变量中成员的信息. 解:程序: #include<stdio.h> #include<string.h> int main() { struct Student { long int num; char name[20]; char sex[10]; float score; }; struct Student stu_1;//定义struct Student类型的变量stu_1 struct Student *p; p = &stu_

【C语言】用结构体数组指针完成:有三个学生信息,存放在结构体数组中,要求输出全部信息

//用结构体数组指针完成:有三个学生信息,存放在结构体数组中,要求输出全部信息 #include <stdio.h> struct Stu { int num; char name[20]; char sex; int age; }; int main() { struct Stu student[3]={{317,"han",'m',20},{318,"hun",'w',22},{311,"dan",'w',18}}; struct

c语言结构体中动态数组的使用

[背景] c语言结构体中动态数组使得用户能够根据需要来申请空间,相比静态数组,更能有效利用存储空间. [正文] 1. 动态数组在结构体中间 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int a; char buf[0]; // 或者char buf[]; int b; }Node; int main() { printf("%d\n", si

全局结构体变量的初始化以及将结构体变量转换为char类型输出问题

#include<stdio.h> #include<stdlib.h> struct node{ int a; int b; char c; char d; }; /*struct node A; 全局变量不能在这儿进行初始化,令我震惊啊,错误让你迷茫到死 A.a=1; A.b=2; A.c='a'; A.d='c';*/ //struct node A={1,2,'a','c'};但是这种写法可以 1:初始化和赋值不是一个概念. 2:// 在全局空间(即函数体之外)只能执行数据

学习C/C++语言:结构体,动态链表

//*************************************************************** //结构体:简单的静态链表 #include<stdio.h> #include<string.h> #define NULL 0 #define SIZE 10 struct student { char num[SIZE]; float score; struct student *next; }; void main() { struct stu

C语言:SWUST OJ,程序设计C 实验六 结构体 题目三 学生结构体链表(0068)

Description: 用结构体建立学生信息,学生信息包括学号.姓名.成绩,建立一个有 n 名学生的链表, 并将链表输出. Input: 一次输入学生信息包括学号.姓名.0 0 0结束程序. Sample Input: C1001 Li 70 M1002 He 89 E1003 Xie 83 M1004 Wu 92 E1005 Bao 80 Sample Output: C1001 Li 70 M1002 He 89 E1003 Xie 83 M1004 Wu 92 E1005 Bao 80

3.结构体与链表

转载请标明出处:http://blog.csdn.net/u012637501 一.结构体 struct Student *p:p是一个struct Student *类型的指针变量, 用于存放struct Student类型变量的地址 1.结构体:把一些基本类型数据组合在一起形参的一个新的复合数据类型,用来表示一些复杂的事物,即称为结构体. 2.定义结构体方法 (1)第一种方法:指定结构体名,不定义结构体变量 struct Student { int age; float score; cha

2015.9.10关于链表中结构体指针的错误

昨天用结构体指针写了一个双链表的程序,编译环境是VC6.0,之前写单链表的时候也是用的这个编译器,但是昨天出了一个让我很费解的问题,代码如下: /********************************************************** * C语言实现双链表 *文件名:list.c *作者:Mr Wan *编写时间:2015.9.9 *功能:实现双链表的简单操作 *版本:1.0 * ********************************************

结构体详解

1 概述 C语言允许用户自己指定这样一种数据结构,它由不同类型的数据组合成一个整体,以便引用,这些组合在一个整体中的数据是互相联系的,这样的数据结构称为结构体,它相当于其它高级语言中记录. 声明一个结构休类型的一般形式如下: struct 结构体名 {成员列表}; 结构体名,用作结构体类型的标志,它又称 结构体标记,大括号内是该结构体中的各个成员,由它们组成一个结构体,对各成员都应进行类型声明如: 类型名 成员名; 也可以把 成员列表称为 域表,第一个成员也称为结构体中的一个域.成员名定名规则写

动态内存分配和链表

什么是链表?链表是一种重要的数据结构,它最大的优点是可以进行动态的存储分配.链表有单向链表,双向链表,循环链表.对于c,这里我们只讨论单向链表.我们知道,内存是由栈和堆组成的.栈空间是由操作系统和编译系统控制的,比如我们定义int a;这个a就是在栈中开辟内存单元的.而堆空间,则允许给用户提供了虚拟空间,在堆中是没有变量名这个说法的,只能通过地址来找到内存中存放的东西. 既然是动态内存分配,当然有动态分配的特殊方法.在c中是以函数的形式实现的.1.malloc函数 函数原型:void *mall