思成老师数据结构1---线型表数据结构实现

//==============stu.h  头文件==============

#ifndef _STU_H

#define _STU_H


typedef struct
{
char sno[5];
char name[21];
char sex[3];
int score;
}ElemType;


#endif

//==============list.h头文件==============

#ifndef _LIST_H
#define _LIST_H
#define LIST_INIT_SIZE 10
#define LIST_INCREME 10
typedef struct
{
ElemType *elem;   //这个是开辟线性表的
int length;       //已用空间
int size; //当前开辟的长度


}LIST;


LIST *InitLIST();
void FreeList(LIST *l);
int InsertList(LIST *list,int position,ElemType *e);
int DeleteList(LIST *l,int position);


#endif



//-------------------------------------------------------------------------------------------------------------------------------------------------------//


//==============list.c头文件==============

#include <stdlib.h>
#include <stdio.h>
#include "stu.h"
#include "list.h"


LIST *InitLIST()
{
LIST *l = (LIST *)malloc(sizeof(LIST));//开辟结构休大小的空间,数据存储大小还没有开辟
if(l == NULL)
{
exit(0);
}
printf("LIST结构开辟成功!\n");


l->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));//开辟LIST_INIT_SIZE 个ElemType的空间

if(l->elem == NULL)
{
free(l);//将已经开辟的一些内存空间拿掉
printf("空间开辟失败");
exit(0);


}
printf("list elem空间开辟成功!\n");
l->length = 0;
l->size = LIST_INIT_SIZE;


return l;
}




void FreeList(LIST *l)
{
free(l->elem);
free(l);
printf("freeList executed!\n");
}


int InsertList(LIST *list,int position,ElemType *e)
{
ElemType *p = NULL,*q= NULL,*newElement;
if(list == NULL || e == NULL)
{
return 0;
}
if(position < 1 || position > list->length+1)  //不能在第0位插入,不能大于已有的长度
{
return 0;
}
if(list->length >= list->size)
{
newElement = realloc(list->elem,(list->size+LIST_INCREME)*sizeof(ElemType));
if(newElement == NULL)
{
return 0;//开辟失败返回0,表示错误
}

list->elem = newElement;
list->size = list->size + LIST_INCREME;


return 1;
}


q = &list->elem[position-1];
for(p = &(list->elem[list->length-1]);p>=q;p--)
{
*(p+1) = *p; //将所有的东西搬过去,如果你插入在首地址,那么运算量会非常大!
}


*q = *e;
++ list->length;


printf("list's length is %d\n",list->length);
printf("list's size is %d\n",list->size);




return 1;

}




int DeleteList(LIST *l,int position)
{
ElemType *crtElemPtr = NULL,*lastcrtElemPtr = NULL;


if(l == NULL)
{
return 0;
}
if(position<1||position>l->length)
{
return 0;
}
crtElemPtr = &(l->elem[position-1]);
lastcrtElemPtr = &(l->elem[l->length - 1]);

for( ;crtElemPtr<=lastcrtElemPtr;crtElemPtr++){
*crtElemPtr = *(crtElemPtr+1);
}




l->length--;
return 1;


}


//====================main.c======================

#include <stdio.h>
#include "stu.h"
#include "list.h"


ElemType stu[4] = {{"s101","张三","男",100},{"s102","李四","女",75},{"s103","王五","男",90},{"s104","赵七","男",80}};


int main(void)
{


int i;
LIST * list1 = NULL;
list1 = InitLIST();
for (i=0;i<4;i++)
InsertList(list1,1,&stu[i]);


DeleteList(list1,1);
FreeList(list1);
return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值