线性表——链式表示和实现(全代码+注释)

本文详细介绍了线性表的链式存储结构,包括单链表的节点定义、初始化、长度获取、插入、删除及获取元素等核心操作的代码实现。通过具体实例,深入解析了链式存储在数据管理上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线性表——链式

#pragma once

/*线性表——链式
  带头结点——同样以0位第一个元素

  代码实现
  void *malloc(unsigned size)//动态申请内存
  void free(void *p)//释放动态申请的内存空间
  sizeof(<已定义的数据类型>)//返回字节个数

*/

//实验例子
//#include<stdio.h>
//#include<malloc.h>

//typedef int DataType;
//#include"LinList.h"
//
//void main(void) {
//    SLNode* head;//本身就是个地址,下面传参就直接输入名就好
//    int i, x;
//
//    ListInitiate(&head);//该函数二级指针
//    for (i = 0; i < 10; i++) {
//        ListInsert(head, i, i + 1);
//    }
//    ListDelete(head, 4, &x);
//    for (i = 0; i < ListLength(head); i++) {
//        ListGet(head, i, &x);
//        printf("%d   ", x);
//    }
//
//    Destroy(&head);
//}

typedef DataType;//如果这里不定义,要在外面定义,否则会报错

//单链表节点定义
typedef struct Node {
    DataType data;
    struct Node* next;
}SLNode;

//初始化
void ListInitiate(SLNode** head) {
    //申请头结点,由head指示其地址
    *head = (SLNode*)malloc(sizeof(SLNode));
    //置结束标记NULL
    (*head)->next = NULL;
}

//求当前数据元素个数
//返回整型个数
int ListLength(SLNode* head) {
    SLNode* p = head;
    int size = 0;//指向头结点时为0;头结点不计入

    while (p->next != NULL) {
        p = p->next;
        size++;
    }
    return size;
}

//在带头结点的单链表head的第i(0<=i<=size)个结点前插入一个存放数据元素x的结点
//插入成功返回1,失败返回0
int ListInsert(SLNode* head, int i, DataType x) {
    SLNode* p, * q;
    int j;

    p = head;
    j = -1;
    while (p->next != NULL && j < i - 1) {
        //最终让指针指向第i-1个结点
        p = p->next;
        j++;
    }

    if (j != i - 1) {
        printf("插入元素位置参数错!");
        return 0;
    }

    q = (SLNode*)malloc(sizeof(SLNode));//生成新结点
    q->data = x;//新结点数据域赋值

    q->next = p->next;//插入步骤1
    p->next = q;        //插入步骤2
    return 1;
}

//删除带头结点单链表head的第i(0<=i<=size)个结点//头结点下标为-1
//被删除结点的数据域有x带回,删除成功则返回1,失败返回0
int ListDelete(SLNode* head, int i, DataType* x) {
    SLNode* p, * s;
    int j;
    p = head;
    j = -1;
    while (p->next != NULL && p->next->next != NULL && j < i - 1) {
        //循环结束时指针指向第i-1个结点
        p = p->next;
        j++;
    }

    if (j != i - 1) {
        printf("删除元素位置参数错误!");
        return 0;
    }

    s = p->next;//指针s指向ai结点
    *x = s->data;//把指针s所指结点的数据域赋值给x
    p->next = p->next->next;//删除
    free(s);//释放指针s所指结点的内存空间
    return 1;
}

//获取第i个数据元素
int ListGet(SLNode* head, int i, DataType* x) {
    SLNode* p;
    int j;

    p = head;
    j = -1;
    while (p->next != NULL && j < i) {
        p = p->next;
        j++;
    }

    if (j != i) {
        printf("取元素位置参数错误!");
        return 0;
    }

    *x = p->data;
    return 1;
}

//撤销单链条,清空内存
void Destroy(SLNode** head) {
    SLNode* p, * p1;

    p = *head;
    while (p != NULL) {
        p1 = p;
        p = p->next;
        free(p1);
    }
    *head = NULL;
}


线性表是一种常见的数据结构,它包含了一组有序的元素,元素之间具有前驱后继关系。线性表链式表示是其中一种实现方式。 线性表链式表示通过使用节点指针表示表中元素之间的关系。具体来说,每个节点中都包含了一个元素一个指向下一个节点的指针。通过不断地遍历指针,就可以顺着链表找到表中的所有元素。 链式表示的优点是可以动态地插入删除元素,而不需要移动其他元素。这是因为链表中的节点通过指针相互连接,可以在任意位置插入删除元素。同时,链式表示可以节省内存空间,因为节点不需要连续的存储空间,可以灵活地分配内存。 实现链式表示的方式是使用结构体来定义节点指针。节点结构体中包含了一个元素一个指向下一个节点的指针。使用指针的方式可以实现链表节点之间的相互连接。 在C语言中,可以通过定义一个节点结构体来表示链表的节点,然后使用指针指向链表的头节点。通过遍历指针,可以遍历整个链表,并对链表进行插入、删除等操作。 总之,线性表链式表示通过节点指针的方式来实现表中元素之间的关系。链式表示可以动态地插入删除元素,并且节省内存空间。在C语言中,可以通过定义节点结构体指针实现链式表示实现链表的各种操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值