顺序表(数据结构)

简介: 顺序表(数据结构)

1.顺序表的概念及结构

1.1线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使

用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,

线性表在物理上存储时,通常以数组和链式结构的形式存储。

2.顺序表分类

顺序表与数组的区别:顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口

顺序表分类:静态顺序表、动态顺序表

3.动态顺序表的实现

#define INIT_CAPACITY 4  
typedef int SLDataType;  
// 动态顺序表 -- 按需申请  
typedef struct SeqList  
{  
    SLDataType* a;  
    int size; // 有效数据个数  
    int capacity; // 空间容量  
}SL;  
//初始化和销毁  
void SLInit(SL* ps);  
void SLDestroy(SL* ps);  
void SLPrint(SL* ps);  
//扩容  
void SLCheckCapacity(SL* ps);  
//头部插入删除 / 尾部插入删除  
void SLPushBack(SL* ps, SLDataType x);  
void SLPopBack(SL* ps);  
void SLPushFront(SL* ps, SLDataType x);  
void SLPopFront(SL* ps);  
//指定位置之前插入/删除数据  
void SLInsert(SL* ps, int pos, SLDataType x);  
void SLErase(SL* ps, int pos);  
int SLFind(SL* ps, SLDataType x);

4.顺序表的应用

4.1 基于动态顺序表实现通讯录

C语言基础要求:结构体、动态内存管理、顺序表、文件操作

4.2 功能要求

1)至少能够存储100个人的通讯信息

2)能够保存用户信息:名字、性别、年龄、电话、地址等

3)增加联系人信息

4)删除指定联系人

5)查找制定联系人

6)修改指定联系人

7)显示联系人信息

4.3 代码实现

//SeqList.h  
#pragma once  
#define _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>  
#include<assert.h>  
#include<stdlib.h>  
#include"contact.h"  
//数据类型为PersonInfo  
typedef struct PersonInfo SQDataType;  
//typedef int SQDataType;  
//动态顺序表  
typedef struct SeqList {  
    SQDataType* a;  
    int size;//保存有效数据个数  
    int capacity;//空间的大小  
}SLT;  
//初始化与销毁  
void SeqListInit(SLT* psl);  
void SeqListDesTroy(SLT* psl);  
void SeqListPrint(SLT sl);  
void CheckCapacity(SLT* psl);  
// 头部插入删除 / 尾部插入删除  
void SeqListPushBack(SLT* psl, SQDataType x);  
void SeqListPushFront(SLT* psl, SQDataType x);  
void SeqListPopBack(SLT* psl);  
void SeqListPopFront(SLT* psl);  
//查找  
int SeqListFind(SLT* psl, SQDataType x);  
// 在指定位置之前插入/删除  
//void SeqListInsert(SLT* psl, int pos, SQDataType x);  
void SeqListInsert(SLT* psl, size_t pos, SQDataType x);  
void SeqListErase(SLT* psl, size_t pos);  
size_t SeqListSize(SLT* psl);  
//修改指定位置的值  
void SeqListAt(SLT* psl, size_t pos, SQDataType x);  
//contact.h  
#pragma once  
#define NAME_MAX 100  
#define SEX_MAX 4  
#define TEL_MAX 11  
#define ADDR_MAX 100  
//前置声明  
typedef struct SeqList contact;  
//用户数据  
typedef struct PersonInfo  
{  
    char name[NAME_MAX];  
    char sex[SEX_MAX];  
    int age;  
    char tel[TEL_MAX];  
    char addr[ADDR_MAX];  
}PeoInfo;  
//初始化通讯录  
void InitContact(contact* con);  
//添加通讯录数据  
void AddContact(contact* con);  
//删除通讯录数据  
void DelContact(contact* con);  
//展示通讯录数据  
void ShowContact(contact* con);  
//查找通讯录数据  
void FindContact(contact* con);  
//修改通讯录数据  
void ModifyContact(contact* con);  
//销毁通讯录数据  
void DestroyContact(contact* con);  
//contact.c  
#define _CRT_SECURE_NO_WARNINGS  
#include"contact.h"  
#include"SeqList.h"  
void LoadContact(contact* con) {  
    FILE* pf = fopen("contact.txt", "rb");  
    if (pf == NULL) {  
        perror("fopen error!\n");  
        return;  
    }  
//循环读取文件数据  
    PeoInfo info;  
    while (fread(&info,sizeof(PeoInfo),1,pf))  
    {  
        SeqListPushBack(con, info);  
    }  
    printf("历史数据导入通讯录成功!\n");  
}  
void InitContact(contact* con) {  
    SeqListInit(con);  
    LoadContact(con);  
}  
void AddContact(contact* con) {  
    PeoInfo info;  
    printf("请输入姓名:\n");  
    scanf("%s", &info.name);  
    printf("请输入性别:\n");  
    scanf("%s", &info.sex);  
    printf("请输入年龄:\n");  
    scanf("%d", &info.age);  
    printf("请输入联系电话:\n");  
    scanf("%s", &info.tel);  
    printf("请输入地址:\n");  
    scanf("%s", &info.addr);  
    SeqListPushBack(con, info);  
    printf("插入成功!\n");  
}  
int FindByName(contact* con, char name[]) {  
    for (int i = 0; i < con->size; i++)  
    {  
        if (0 == strcmp(con->a[i].name, name)) {  
            return i;  
        }  
    }  
    return -1;  
}  
void DelContact(contact* con){  
    char name[NAME_MAX];  
    printf("请输入要删除的用户姓名:\n");  
    scanf("%s", name);  
    int pos = FindByName(con, name);  
    if (pos < 0) {  
        printf("要删除的用户不存在,删除失败!\n");  
        return;  
    }  
    SeqListErase(con, pos);  
    printf("删除成功!\n");  
}  
void ShowContact(contact* con){  
    printf("%-10s %-4s %-4s %15s %-20s\n", "姓名", "性别", "年龄", "联系电  
    话", "地址");  
    for (int i = 0; i < con->size; i++)  
    {  
        printf("%-10s %-4s %-4d %15s %-20s\n",  
               con->a[i].name,  
               con->a[i].sex,  
               con->a[i].age,  
               con->a[i].tel,  
               con->a[i].addr);  
    }  
}  
void FindContact(contact* con){  
    char name[NAME_MAX];  
    printf("请输入要查找的用户姓名:\n");  
    scanf("%s", name);  
    int pos = FindByName(con, name);  
    if (pos < 0) {  
        printf("要查找的用户不存在,查找失败!\n");  
        return;  
    }  
    printf("查找成功!\n");  
    printf("%-10s %-4s %-4d %15s %-20s\n",  
           con->a[pos].name,  
           con->a[pos].sex,  
           con->a[pos].age,  
           con->a[pos].tel,  
           con->a[pos].addr);  
}  
void ModifyContact(contact* con) {  
    char name[NAME_MAX];  
    printf("请输入要修改的用户名称:\n");  
    scanf("%s", name);  
    int pos = FindByName(con, name);  
    if (pos < 0) {  
        printf("要查找的用户不存在,修改失败!\n");  
        return;  
    }  
    PeoInfo info;  
    printf("请输入要修改的姓名:\n");  
    scanf("%s", &con->a[pos].name);  
    printf("请输入要修改的性别:\n");  
    scanf("%s", &con->a[pos].sex);  
    printf("请输入要修改的年龄:\n");  
    scanf("%d", &con->a[pos].age);  
    printf("请输入要修改的联系电话:\n");  
    scanf("%s", &con->a[pos].tel);  
    printf("请输入要修改的地址:\n");  
    scanf("%s", &con->a[pos].addr);  
    printf("修改成功!\n");  
}  
void SaveContact(contact* con) {  
    FILE* pf = fopen("contact.txt", "wb");  
    if (pf == NULL) {  
        perror("fopen error!\n");  
        return;  
    }  
//将通讯录数据写入文件  
    for (int i = 0; i < con->size; i++)  
    {  
        fwrite(con->a + i, sizeof(PeoInfo), 1, pf);  
    }  
    printf("通讯录数据保存成功!\n");  
}  
void DestroyContact(contact* con) {  
    SaveContact(con);  
    SeqListDesTroy(con);  
}  
//test.c  
#include"SeqList.h"  
#include"contact.h"  
void menu() {  
//通讯录初始化  
    contact con;  
    InitContact(&con);  
    int op = -1;  
    do {  
        printf("********************************\n");  
        printf("*****1、添加用户 2、删除用户*****\n");  
        printf("*****3、查找用户 4、修改用户*****\n");  
        printf("*****5、展示用户 0、退出 *****\n");  
        printf("********************************\n");  
        printf("请选择您的操作:\n");  
        scanf("%d", &op);  
        switch (op)  
        {  
            case 1:  
                AddContact(&con);  
                break;  
            case 2:  
                DelContact(&con);  
                break;  
            case 3:  
                FindContact(&con);  
                break;  
            case 4:  
                ModifyContact(&con);  
                break;  
            case 5:  
                ShowContact(&con);  
                break;  
            default:  
                printf("输入有误,请重新输入\n");  
                break;  
        }  
    } while (op!=0);  
//销毁通讯录  
    DestroyContact(&con);  
}
相关文章
|
2月前
|
存储 C语言
【数据结构】顺序表
数据结构中的动态顺序表
37 3
【数据结构】顺序表
|
11天前
|
存储 Java 程序员
【数据结构】初识集合&深入剖析顺序表(Arraylist)
Java集合框架主要由接口、实现类及迭代器组成,包括Collection和Map两大类。Collection涵盖List(有序、可重复)、Set(无序、不可重复),Map则由键值对构成。集合通过接口定义基本操作,具体实现由各类如ArrayList、HashSet等提供。迭代器允许遍历集合而不暴露其实现细节。List系列集合元素有序且可重复,Set系列元素无序且不可重复。集合遍历可通过迭代器、增强for循环、普通for循环及Lambda表达式实现,各有适用场景。其中ArrayList实现了动态数组功能,可根据需求自动调整大小。
26 11
|
19天前
|
存储 C语言 C++
数据结构基础详解(C语言) 顺序表:顺序表静态分配和动态分配增删改查基本操作的基本介绍及c语言代码实现
本文介绍了顺序表的定义及其在C/C++中的实现方法。顺序表通过连续存储空间实现线性表,使逻辑上相邻的元素在物理位置上也相邻。文章详细描述了静态分配与动态分配两种方式下的顺序表定义、初始化、插入、删除、查找等基本操作,并提供了具体代码示例。静态分配方式下顺序表的长度固定,而动态分配则可根据需求调整大小。此外,还总结了顺序表的优点,如随机访问效率高、存储密度大,以及缺点,如扩展不便和插入删除操作成本高等特点。
|
19天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
1月前
|
存储 算法
【数据结构与算法】顺序表
【数据结构与算法】顺序表
16 0
【数据结构与算法】顺序表
|
1月前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
1月前
|
存储 测试技术
【初阶数据结构篇】顺序表的实现(赋源码)
线性表(linearlist)是n个具有相同特性的数据元素的有限序列。
|
1月前
|
存储 编译器
【数据结构】顺序表(长期维护)
【数据结构】顺序表(长期维护)
|
1月前
|
存储 缓存
【数据结构】——顺序表与链表
【数据结构】——顺序表与链表
|
2天前
|
存储