链式顺序表实现(C语言描述)

简介: 本文介绍了如何在C语言中实现链式顺序表,包括数据结构的定义、节点的创建、数据的插入和删除以及链表的打印和销毁。

链式顺序表

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

//为数据创建比较准则
typedef struct Data_tlg {
    int key;
    char name[20];
}DATA,*LPDATA;

//定义节点结构
typedef struct Node_tlg {
    DATA data;
    struct Node_tlg* next;
}NODE,*LPNODE;

//定义顺序表结构
typedef struct sqList_tlg {
    LPNODE headNode;
    int curSize;
}SQLIST,*LPSQLIST;

//创建表头
LPNODE createHead() {
    LPNODE headNode = (LPNODE)malloc(sizeof(NODE));
    if (NULL == headNode) {
        printf("头节点申请失败!\n");
        return NULL;
    }
    headNode->next = NULL;
    return headNode;
}

//创建节点
LPNODE createNode(DATA data) {
    LPNODE newNode = (LPNODE)malloc(sizeof(NODE));
    if (NULL == newNode) {
        printf("数据节点申请失败!\n");
        return NULL;
    }
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

//创建链表
LPSQLIST createSqList() {
    LPSQLIST sqList = (LPSQLIST)malloc(sizeof(SQLIST));
    if (NULL == sqList) {
        printf("顺序表申请失败!\n");
        return NULL;
    }
    sqList->curSize = 0;
    sqList->headNode = createHead();
    return sqList;
}

//打印链表
void printSqList(LPSQLIST sqList) {
    if (sqList == NULL)
        exit(0);
    LPNODE curNode = sqList->headNode->next;
    while(curNode != NULL)
    {
        printf("key:%d,name:%s\n", 
            curNode->data.key, curNode->data.name);
        curNode = curNode->next;
    }
    putchar('\n');
}
//数据插入
void insertDataByKey(LPSQLIST sqList,DATA data) {
    LPNODE newNode = createNode(data);
    LPNODE curNode = sqList->headNode->next;
    LPNODE preNode = sqList->headNode;
    while (curNode != NULL && curNode->data.key < newNode->data.key) {
        preNode = curNode;
        curNode = curNode->next;
    }
    newNode->next = curNode;
    preNode->next = newNode;
    sqList->curSize++;
}

//数据删除
void deleteDataByKey(LPSQLIST sqList, int key) {
    LPNODE preNode = sqList->headNode;
    LPNODE curNode = sqList->headNode->next;
    while (curNode != NULL && curNode->data.key != key) {
        preNode = curNode;
        curNode = curNode->next;
    }
    if (curNode) {
        preNode->next = curNode->next;
        free(curNode);
        curNode = NULL;
    }
    else {
        printf("未找到指定节点!\n");
        return;
    }
    sqList->curSize--;
}
//万金油函数
int size(LPSQLIST sqList) {
    return sqList->curSize;
}
int empty(LPSQLIST sqList) {
    return sqList->curSize == 0;
}
//销毁顺序表
void destroySqList(LPSQLIST* sqList) {
    while((*sqList)->headNode->next != NULL) {
        deleteDataByKey(*sqList, (*sqList)->headNode->next->data.key);
    }
    if ((*sqList)->headNode->next == NULL) {
        free((*sqList)->headNode);
        (*sqList)->headNode = NULL;
        free(*sqList);
        *sqList = NULL;
    }
    else {
        printf("链表数据销毁失败!\n");
        return;
    }
}

int main()
{
    LPSQLIST sqList = createSqList();

    DATA array[4] = { {2,"张三"},{1,"李四"},{6,"电铲"},{4,"卢布"} };
    //数据插入
    for (int i = 0; i < 4; i++)
    {
        insertDataByKey(sqList, array[i]);
    }
    printSqList(sqList);

    //数据删除
    deleteDataByKey(sqList, 4);
    printSqList(sqList);
    deleteDataByKey(sqList, 8);
    printSqList(sqList);

    //顺序表销毁
    destroySqList(&sqList);
    if (sqList == NULL) {
        printf("顺序表销毁成功!\n");
    }
    else {
        printf("顺序表销毁失败!\n");
    }

    system("pause");
    return 0;
}
相关文章
|
21小时前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
11 2
|
23小时前
|
C语言
顺序表数组法构建(C语言描述)
如何使用C语言通过数组方法构建有序顺序表,包括顺序表的创建、插入、删除和打印等。
9 2
|
23小时前
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
7 0
|
23小时前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
8 0
|
1月前
|
存储 C语言 C++
数据结构基础详解(C语言) 顺序表:顺序表静态分配和动态分配增删改查基本操作的基本介绍及c语言代码实现
本文介绍了顺序表的定义及其在C/C++中的实现方法。顺序表通过连续存储空间实现线性表,使逻辑上相邻的元素在物理位置上也相邻。文章详细描述了静态分配与动态分配两种方式下的顺序表定义、初始化、插入、删除、查找等基本操作,并提供了具体代码示例。静态分配方式下顺序表的长度固定,而动态分配则可根据需求调整大小。此外,还总结了顺序表的优点,如随机访问效率高、存储密度大,以及缺点,如扩展不便和插入删除操作成本高等特点。
113 5
|
1月前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
4月前
|
存储 C语言
数据结构——顺序表(C语言版)
数据结构——顺序表(C语言版)
53 5
|
4月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
42 1
|
4月前
|
存储 算法 安全
数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)
数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)
32 0
|
4月前
|
存储 C语言
数据结构之顺序表(C语言版)
数据结构之顺序表(C语言版)
26 0