单链表的操作(一)链表的原理与程序

单链表的结构组成

  • 链表是一系列有结构体类型结点组成,每个结点都是由结构体数据成员和地址成员两部分构成。
  • 数据成员部分称为数据域,用于存放结点数据;地址成员部分作为指针域,用于存放指向下一个结构体类型结点的地址指针
  • 访问链表结构各结点的数据,需要从链表的head头指针开始查找。后续结点的地址,可由当前结点的地址域给出。

程序运行是,无论访问链表中的哪一个结点,都要从链表头开始,顺序向后查询,链表的尾结点,指针域设为NULL空值

 

静态单链表的创建与打印

/*L11_6.C*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct student
{

    long int number;

    char name[20];

    float score;

    struct student *next; /*定义结构体成员指针*/

};

int main()

{

    struct student st1,st2,st3,*head;

    head =&st1;

    st1.next=&st2;

    st2.next=&st3;

    st3.next=NULL;

    st1.number=201501;strcpy(st1.name,”zzf”);st1.score=100;

    st1.number=201502;strcpy(st1.name,”zyy”);st1.score=80;

    st1.number=201503;strcpy(st1.name,”cxy”);st1.score=87;

    while(head == NULL)/*访问链表为非空时输出当前结点的值*/

    {

        printf(“学号:%ld,姓名:%s,成绩:%5.2f\n”,head->number,head->name,head->score);

        Head=head->next;/*指向下一个结点*/

    }


}

 

动态链表的创建与引用

利用以下函数创建和释放链表结点,可实现动态链表结构的应用

1、malloc()函数

             malloc()函数用于申请分配单个结构体变量的内存空间。

            用以存放一个结构体类型变量的数据,同时使结构体指针P,指向该结构体变量存储空间的起始地址。

            malloc()函数原型定义为void类型,一般在使用是用强制类型转换将其转换为所需类型。如

            p=(struct student*)malloc(sizeof(struct student));

2、calloc()函数

         calloc()函数用于申请分配一组结构体变量内存空间。

例如

        使用calloc()函数申请分配长度为12个结构体变量组成的一维结构体数组内存空间,并使结构体指针ps指向分配成功的内存空间起始地 址

struct student *ps;

ps = (struct student*)calloc(12,sizeof(struct student));

3、free()函数

        free()函数用于释放指针变量指向占用的内存空间。

例如,要释放

     ps = (struct student*)calloc(12,sizeof(struct student));

         命令执行后,指针变量ps指向的占用内存区域,可执行

free(*ps);

           将释放ps指向的一维结构体数组所占用的内存空间。

 

 单向动态链表的创建与引用

创建动态链表的过程,就是按已定义的结构体类型,逐个开辟内存空间,创建

结点,输入数据并建立结点之间的链接,形成链表结构。

1、建立单向链表

例如,有许多学生数据需要输入,需建立多个学生结点的动态链表。

步骤如下:

  1. 定义链表数据结构
  2. 使用malloc(sizeof(结构体类型))开辟结点;
  3. 输入该节点数据,将该节点指针域成员赋为NULL值;
  4. 设置循环控制链表结点个数,只要输入数据有效就视为新结点;
  5. 判断新结点是否第一个结点,若是将head指向该节点,作为链表的表头;
  6. 若新结点不是第一个结点,将新结点接到表尾,将指针域赋为NULL值;
  7. 再用malloc(sizeof(结构体类型))函数开辟下一个结点;

依次循环直到结点数据输入结束,链表结构则创建完成。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/*定义链表结构内容*/
struct list
{
        char name[10];
        long int number;
        struct list *next;

};

/*创建链表插入函数,函数返回类型也必须是结构体指针(*head)   */
struct list *insert(struct list *p)
{
        int n=1;
        struct list *p1,*p2,*head;
        head = p;
      
/*指向结构体的指针必须先初始化,才能赋值,否则出现段错误*/
        p1=p2=(struct list*)malloc(sizeof(struct list));
        printf("please input the %d th name :  number  : \n",n++);
        scanf("%s%ld",p1->name,&p1->number);
        p1->next =NULL;
        while((p1->number)>0)    /*新建结点,p1,p2指向新结点,往新结点写入数据,若数据有效则再新建结点,让p1重新指向新建的结点,p2=p1    */
        {
                if(head ==NULL) head = p1;
                else p2->next=p1;
                p2= p1;
                p1=(struct list*)malloc(sizeof(struct list));
                printf("please input the %dth name :  number  : \n",n++);
                scanf("%s%ld",p1->name,&p1->number);
                p1->next = NULL;
        }
        free(p1);
        return  head;
}

/*輸出链表中的内容*/
void putout(struct list *head)
{
        while(head!=NULL)
        {
                printf("name:%s\t number:%ld\n",head->name,head->number);
                head = head->next;
        }

}

int main()
{
        struct list *head;
        head=NULL;
        head=insert(head);
        putout(head);
        return 0;
}

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值