数据机构-2(顺序表)

本文详细介绍了如何在C语言中使用顺序表数据结构,包括创建顺序表、检查表是否满、插入元素到尾部、查找特定元素、修改元素值、删除元素以及清理列表的操作。
摘要由CSDN通过智能技术生成

线性表

概念

顺序表

示例:创建一个存储学生信息的顺序表

表头(Tlen总长度, Clen当前长度)

函数

#include <seqlist.c>

#include <stdio.h>
#include <stdlib.h>
#include "seqlist.h"
#include <string.h>
SeqList *CreateSeqList(int len)
{
    SeqList *s1 = (SeqList *)malloc(sizeof(SeqList));
    if(NULL == s1)
    {
        perror("Create SeqList malloc fail");
        return NULL;
    }

    s1->head = (DATATYPE *)malloc(sizeof(DATATYPE)*len);
    if(NULL == s1->head)
    {
        perror("create sqlist head malloc");
        return NULL;
    }

    s1->tlen = len;
    s1->clen = 0;

    return s1;
}

int IsFullSeqList(SeqList *list)
{
    return list->clen == list->tlen;
}

int InsertTailSeqList(SeqList *list, DATATYPE *data)
{
    if(IsFullSeqList(list))
    {
        return -1;
    }

    memcpy(&list->head[list->clen], data, sizeof(DATATYPE));
    ++list->clen;

    return 0;
}
int get_size_seqlist(SeqList *list)
{
    return list->clen;
}
int ShowSeqList(SeqList *list)
{
    int len = get_size_seqlist(list);
    int i = 0 ;
    for(i = 0; i < len; ++i)
    {
        printf("%s %c %d %d\n", list->head[i].name, list->head[i].sex, list->head[i].age, list->head[i].score);
    }
    return 0;
}

int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos)
{
    if(IsFullSeqList(list) || pos > list->clen)
    {
        perror("insert fail");
        return -1;
    }
    
    int i = 0;
    for(i = list->clen; pos<i; --i)
    {
        list ->head[i] = list->head[i-1];
    }
    memcpy(&list->head[pos], data, sizeof(DATATYPE));
    list->clen++;
    return 0;
}

int FindSeqList(SeqList *list, char *name)
{
    int len = get_size_seqlist(list);\
    int i = 0;
    for(i = 0; i < len; ++i)
    {
        if(0 == strcmp(list->head[i].name, name))
        {
            return i;
        }
    }
    return -1;
}


DATATYPE* get_item_seqlist(SeqList *list, int pos)
{
    if(pos < 0 || pos >= list->clen)
    {
        return NULL;
    }
    return &list->head[pos];
}

int ModifySeqList(SeqList *list, char *name, DATATYPE *newdata)
{
    int ret = FindSeqList(list, name);
    if(-1 == ret)
    {
        return -1;
    }
    memcpy(&list->head[ret], newdata, sizeof(DATATYPE));
    return 0;
}
int ClearSeqList(SeqList *list)
{
    list->clen = 0;
    return 0;
}

int DestroySeqList(SeqList *list)
{
    free(list->head);
    free(list);
    return 0;
}

int DeleteSeqList(SeqList *list, char *name)
{
    int ret = FindSeqList(list, name);
    if(ret < 0)
    {
        printf("not find");
        return -1;
    }
    int i = ret;
    for(; i < list->clen; i++)
    {
        memcpy(&list->head[i+1], &list->head[i], sizeof(list->head[0]));
    }
    list->clen--;
}

#include “seqlist.h”

#ifndef _SEQLIST_H
#define _SEQLIST_H

typedef struct person{
    char name[32];
    char sex;
    int age;
    int score;
}DATATYPE;

typedef struct list{
    DATATYPE *head;
    int tlen;
    int clen;
}SeqList;

SeqList *CreateSeqList(int len);
int DestroySeqList(SeqList *list);//free
int ShowSeqList(SeqList *list);//show
int InsertTailSeqList(SeqList *list, DATATYPE *data);//写
int IsFullSeqList(SeqList *list);//clen ?= tlen
int IsEmptySeqList(SeqList *list);
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos);//插入
int FindSeqList(SeqList *list, char *name);//find
int ModifySeqList(SeqList *list, char *old, DATATYPE *new);//修改
int DeleteSeqList(SeqList *list, char *name);//删除某
int ClearSeqList(SeqList *list);//clear all
int get_size_seqlist(SeqList *list);//clen = ?
DATATYPE *get_item_seqlist(SeqList *list, int pos);//get head[?]



#endif

主函数


#include <stdio.h>
#include "seqlist.h"

int main()
{
    DATATYPE data[] = {
        {"jack", 'm', 20, 90},
        {"tom", 'm', 21, 78},
        {"tony", 'f', 19, 42},
        {"sora", 'f', 23, 74},
        {"amy", 'f', 21, 69}
    };
    SeqList *s1 = CreateSeqList(10);

    InsertTailSeqList(s1, &data[0]);
    InsertTailSeqList(s1, &data[1]);
    InsertTailSeqList(s1, &data[2]);
    
    ShowSeqList(s1);
    printf("----------------------------------------\n");

    InsertPosSeqList(s1, &data[4], 2);
    ShowSeqList(s1);
    printf("----------------------------------------\n");
    
    int ret = FindSeqList(s1, "tony");
    if(-1 == ret)
    {
        printf("not find\n");
    }
    else
    {
        DATATYPE *tmp = get_item_seqlist(s1, ret);
        printf("%s  %d\n", tmp->name, tmp->score);
    }
    printf("----------------------------------------\n");
    
    ModifySeqList(s1, "lisi", &data[4]);
    ShowSeqList(s1);
    printf("----------------------------------------\n");
    
    DeleteSeqList(s1, "tony");
    ShowSeqList(s1);
    
    ClearSeqList(s1);
    DestroySeqList(s1);
    return 0;
}

内存泄漏检测

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值