动态创建链表及打印链表 (链表学习 一)

来源:互联网 发布:linux df产生文件 编辑:程序博客网 时间:2024/05/10 05:43

动态创建链表主要思想:定义三个执行结构体类型数据的指针,head,p1,p2,当输入的值p1->num不为0并且为第一个节点的时候,把该节点赋给头结点

p1这个指针,主要是用来指向刚输入过数据的节点,p2这个指针,主要负责把p1刚输入的数据的这个节点加到链表中来。当输入为0时程序结束,返回头结点,具体流程如下:

当我们输入: 

1001,23,4

1002,34.5

1003,45.6

0,0  

执行过程:

1.定义p1,p2并输入1001,23,4初始化p1,然后判断p1->num是否为0,不为0继续执行,程序中的n为记录节点个数

当节点数n==1的时候,把p1赋给头结点,p2->next = p1;此时p2 = head,也就是第一个节点

2.继续执行,输入1002,34.5,并初始化p1,此时n==2,执行p2->next = p1,也就是head->next = p1;就把p1新初始化的这个节点加入到链表中去了,然后p2 = p1,把p2指针又移动到最后一个节点,接续执行

3.添加第三个节点,与上面第2步一样

4.输入0,0创建链表结束

5.调用print函数打印链表,将头指针传过去,然后遍历打印链表



#include<stdio.h>#include<stdlib.h>#define LEN sizeof(struct Student)//初始化链表struct Student{    long num;    float score;    struct Student *next;};int n;struct Student* creat(void){ //定义函数,返回一个执行链表头的指针    struct Student *head;    struct Student *p1,*p2;    n = 0;   //全局变量,记录节点的个数    p1 = p2 = (struct Student*)malloc(LEN); //开辟一个新单元    scanf("%ld,%f",&p1->num,&p1->score);    head = NULL;    while(p1->num != 0){      n = n+1;      if(n==1){   //当为第一个节点的时候,把指针赋给头指针        head = p1;      }else{         p2->next = p1;      }        p2=p1;        p1 = (struct Student*)malloc(LEN); //开辟动态存储区,把初始地址赋给p1        scanf("%ld,%f",&p1->num,&p1->score);    }    p2->next = NULL;   return(head);}void print(struct Student *head){    struct Student *p;    printf("\nNow,These %d records are:\n",n);    p = head;    if(head != NULL){        do{            printf("%ld,%5.1f\n",p->num,p->score);            p = p->next;        }while(p != NULL);    }}int main(){    struct Student *pt;    pt = creat();    print(pt);    return 0;}


原创粉丝点击