Day 51 线性表顺序存储

本文详细介绍了使用C语言实现线性表的顺序存储结构,包括创建、插入、删除、查找、修改等基本操作,并探讨了内存分配与释放的注意事项,以及如何避免双释放错误。

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

如果申请的空间已经释放了,还再次释放会出现程序段错就如下面的情况:
*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x09b2d1d8 ***

内存泄露检测工具
sudo apt-get install valgrind
valgrind ./a.out

char buf[1024];

线性表顺序存储的优点,缺点
优点
1,无需为表中的逻辑关系增加额外的存储空间
2,可以快速随机访问元素O(1)
缺点
1,插入,删除元素需要移动元素o(n)
2,无法动态存储。

#ifndef HEAD
#define HEAD
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <strings.h>

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

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

extern SeqList *CreateSeqList(int len);
extern int IsFullSeqList(SeqList *list);
extern int IsEmptySeqList(SeqList *list);
extern int InsertTailSeqList(SeqList *list, DATATYPE *data);
extern int ShowSeqList(SeqList *list);
extern int DestroySeqList(SeqList *list);
extern int ClearSeqList(SeqList *list);
extern int InserPosSeqList(SeqList *list,int pos,DATATYPE *data);
extern int FindSeqList(SeqList *list, char *name);
extern int ReviseSeqList(SeqList *list, char *oldname, DATATYPE *newdata);
extern int DeleteSeqList(SeqList *list, char *name);
extern int GetElem(SeqList *list, int id);
extern int ListLength(SeqList *list);
extern SeqList * CombineSqlist(SeqList *list, SeqList *list1);
extern int Seqlist_sort_age(SeqList *list);
#endif // HEAD

#include “head.h”

int main(void)
{
SeqList *list = CreateSeqList(5);

//male female
DATATYPE data[]={
    {"zhangsan",'M',60,80},
    {"lisi",'F',50,81},
    {"wangmazi",'M',19,82}
    
};

SeqList *list1 = CreateSeqList(10);

//male female
DATATYPE data1[]={
    {"songjiang",'M',40,80},
    {"wuyong",'F',39,81},
    {"huanggai",'M',56,82},
    {"linchong",'M',41,88},
    {"luzhisheng",'M',42,89},
    {"guanerge",'M',67,88},
    {"caocao",'M',55,89}
};

int i = 0 ;
for(i = 0 ;i<3;i++)
InsertTailSeqList(list,&data[i]);
//ShowSeqList(list);

for(i = 0; i<7;i++)
    InsertTailSeqList(list1,&data1[i]);
// ShowSeqList(list1);
/*printf("H---------------------pos ins\n");
InserPosSeqList(list,3,&data[3]);
ShowSeqList(list);

printf("H---------------------rev \n");
//查找
ReviseSeqList(list,"zhangsan1",&data[4]);
ShowSeqList(list);*/

// printf("H---------------------del \n");
//  DeleteSeqList(list, "lisi4");
// ShowSeqList(list);
// printf("H---------------------del \n");
//GetElem(list,5);
//int ret = ListLength(list);
//printf("List length is %d\n", ret);
//printf("Hello World!\n");
//将两个顺序表合并
SeqList * combin_List = CombineSqlist(list,list1);
ShowSeqList(combin_List);
printf("H+++++++++++++++++\n");
//按照年龄排序
Seqlist_sort_age(combin_List);

ShowSeqList(combin_List);
DestroySeqList(combin_List);


//DestroySeqList(list);
//DestroySeqList(list1);
// DestroySeqList(list);


return 0;

}

#include “head.h”

SeqList *CreateSeqList(int len)
{

SeqList *temp= malloc(sizeof(SeqList));
if(NULL == temp)
{
    
    perror("creaete seqlist malloc");
    return NULL;
}
temp->head = malloc(sizeof(DATATYPE)*len);
temp->clen = 0;
temp->tlen = len;
return temp;

}

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

int IsEmptySeqList(SeqList *list)
{
return list->clen == 0;
}

int InsertTailSeqList(SeqList *list, DATATYPE *data)
{
    //list->head[list->clen] = *data;
    if(IsFullSeqList(list))
    {
        printf("list is full\n");
        return 1;
    }
    memcpy(&list->head[list->clen],data,sizeof(DATATYPE));
    list->clen++;
    return 0;
    
}

int ShowSeqList(SeqList *list)
{
int i = 0 ;
for(i =0;iclen;i++)
{

    printf("%s:%d:%d\n",list->head[i].name,list->head[i].age, list->head[i].score);
}
return 0;

}

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

int ClearSeqList(SeqList *list)
{

list->clen = 0;
return 0;

}
int InserPosSeqList(SeqList *list,int pos,DATATYPE *data)
{
if(IsFullSeqList(list))
{
printf(“seqlist is full\n”);
return 1;
}
if(pos>=0 && pos<=list->clen)
{
int i = 0 ;
for(i=list->clen-1;i>=pos;i–)
{

        list->head[i+1] = list->head[i];
    }
    //list->head[pos] = *data;
    memcpy(&list->head[pos],data,sizeof(DATATYPE));
    list->clen++;
    return 0;
}
printf("pos error\n");
return 1;

}

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

int ReviseSeqList(SeqList *list, char *oldname, DATATYPE *newdata)
{

    int i  =  FindSeqList(list,oldname);
    if(-1 != i)
    {
        memcpy(&list->head[i],newdata,sizeof(DATATYPE));
        return 0;
    }
    else
    {
        printf("cat't find per.modify failure...%s\n",oldname);
        return 1;
    }

}

int DeleteSeqList(SeqList *list, char *name)
{

    int ret = FindSeqList(list,name);
    int i = 0;
    if(-1 != ret)
    {
        if(ret == list -> tlen -1)
        {
            bzero(&list-> head[ret],0);
        }
        for(i= ret; i< list->tlen -1; ++i)
        {
            memcpy(&list->head[i], &list->head[i+i],sizeof(DATATYPE));
        }
        list->clen--;
        
    }
    else
    {
        printf("not find meber\n");
        return 1;
    }
    return 0;

}

int GetElem(SeqList *list, int id)
{

    if(id >= 0 && id <= list->clen)
    {
        int i =0;
        for(i = 0; i< list->clen; ++i)
        {
            if(id == i)
            {
                printf("%s:%d\n",list->head[i].name,list->head[i].score);
                return 0;
            }
        }
        
    }
    printf("not id\n");
    return 1;

}
int ListLength(SeqList *list)
{
int ret = list->clen;
//printf(“List length is %d\n”, ret);
return ret;
}

SeqList* CombineSqlist(SeqList *list, SeqList *list1)
{

SeqList *temp = NULL;
int sum = list->clen +list1->clen;
if(list->tlen > list->clen +list1->clen)
{
    int i =0;
    for(i =0; i< list1->clen; ++i)
    {
        memcpy(&list->head[list->clen],&list1->head[i],sizeof(DATATYPE));
        list->clen++;
    }
    
    free(list1->head);
    free(list1);
    
    return list;
}
else
{
    temp = malloc(sizeof(SeqList));
    if(NULL == temp)
    {
        
        perror("Combin creaete seqlist malloc");
        return NULL;
    }
    temp->head = malloc(sizeof(DATATYPE)*sum);
    temp->clen = 0;
    temp->tlen = sum;
    
    int i=0;
    for(i = 0; i < list->clen; ++i)
    {
        memcpy(&temp->head[i],&list->head[i], sizeof(DATATYPE));
        temp->clen++;
    }
    
    for(i =0; i<list1->clen; ++i)
    {
        memcpy(&temp->head[temp->clen],&list1->head[i], sizeof(DATATYPE));
        temp->clen++;
    }
    
    free(list->head);
    free(list);
    free(list1->head);
    free(list1);
    
}
return temp;

}

int Seqlist_sort_age(SeqList *list)
{

int sum = list->clen;
int i= 0;
int j= 0;
for(i= 0; i< sum-1; i++)
{
    for(j = i+1; j< sum; ++j)
    {
        if(list->head[i].age > list->head[j].age)
        {
            char * ret = malloc(sizeof(DATATYPE));
            memcpy(ret,&list->head[i],sizeof(DATATYPE));
            memcpy(&list->head[i],&list->head[j],sizeof(DATATYPE));
            memcpy(&list->head[j], ret, sizeof(DATATYPE));
            free(ret);
        }
    }
}
return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值