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

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

摘要生成于 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值