欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-26 18:41:40
...

单链表的结构组成

  • 链表是一系列有结构体类型结点组成,每个结点都是由结构体数据成员和地址成员两部分构成。
  • 数据成员部分称为数据域,用于存放结点数据;地址成员部分作为指针域,用于存放指向下一个结构体类型结点的地址指针
  • 访问链表结构各结点的数据,需要从链表的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;
}