如果申请的空间已经释放了,还再次释放会出现程序段错就如下面的情况:
*** 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;
}