我学的是数据结构这本书,开篇就是线性表,刚接触的时候真的事一窍不通,后来看了不少的博客才慢慢明白,下面是我的线性表代码,把main函数去掉就可以当头文件用,不会的朋友可以参考一下。
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define OVERFLOW -2
#define ERROR 0
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef int Status;
typedef struct//如果不是指针一般是stu[0].elem,指针一般是p->elem;
{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList *L)//此表的建立并不同与链表,此表不返回head,所建立的L就是实体,是在L这个结构体上建立的的,
{ //并不是定义的指针代表的,而L是主函数传给他的,L就是100空间的表,大小固定
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}
Status DestroyList(SqList *L)
{
free(L);
return OK;
}
Status ClearList(SqList *L)
{
L->length=0;
return 1;
}
Status ListEmpty(SqList *L)
{
return L->length==0?FALSE:TRUE;
}
Status ListLength(SqList *L)
{
return L->length;
}
Status getElem(SqList L,int i,ElemType *e)
{
if(i<1||i>L.length)return 0;
*e=L.elem[i-1];
return OK;
}
Status lookup(SqList L,ElemType e)
{
int i;
ElemType *p;
p=L.elem;
for(i=0;i<L.length&&*p++!=e;)i++;
if(i<L.length)return i+1;
else return 0;
}
Status insert(SqList *L,int i,ElemType e)
{
int j;
ElemType *newbase;
if(i<1||i>L->length+1)return ERROR;//0之前无元素
if(L->length>=L->listsize)
{
newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);
L->elem=newbase;
L->listsize+=LISTINCREMENT;
}
for(j=L->length;j>=i;j--)
L->elem[j]=L->elem[j-1];
L->elem[i-1]=e;
L->length++;
return 1;
}
Status deletes(SqList *L,int i,ElemType *e)
{
int j;
if((i<1)||(i>L->length))return ERROR;
*e=L->elem[i-1];
for(j=i-1;j<=L->length-1;j++)
L->elem[j]=L->elem[j+1];
L->length--;
return OK;
}
Status print(SqList L)
{
int i;
printf("\n\n");
for(i=0; i<L.length; i++)
{
printf("%d ",L.elem[i]);
}
printf("\n\n\n");
return 0;
}
Status scan(SqList *L)
{
int i,n;
printf("输入元素个数\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&L->elem[i]);
L->length++;
}
return 0;
}
int main()
{
int k;
ElemType e;
SqList L;//如果是*L,那么定义的是一个SqList类型的指针,那么传过去的是一个未知的地址,大小为这个类型的
if(InitList_Sq(&L)==OK)printf("successful!\n");//结构体大小,如果是实体L的地址,那么首地址已知,空间为100.
else printf("defaule!\n");
printf("get numbers\n");
scan(&L);
print(L);
for(;;)
{
printf("\n");
printf("1.DestroyList 2.ClearList 3.ListEmpty 4.ListLength\n5.getElem 6.lookup 7.insert 8.deletes 9.exit\n");
scanf("%d",&k);
switch(k)
{
case 1:if(DestroyList(&L))printf("DestroyList is OK\n");break;
case 2:if(ClearList(&L))printf("ClearList is OK\n");break;
case 3:if(ListEmpty(&L))printf("The List is exist!\n");break;
case 4:printf("The ListLength is %d\n",ListLength(&L));break;
case 5:
{
int i;
printf("输入要查询的编号\n");
scanf("%d",&i);
if(getElem(L,i,&e))printf("第%d个是%d\n",i,e);break;
}
case 6:
{
int e,pos;
printf("输入要查找的值\n");
scanf("%d",&e);
pos=lookup(L,e);
if(pos>0)printf("位置是%d\n",pos);
else printf("not found\n");
break;
}
case 7:
{
int i,e;
printf("输入插入的位置和值\n");
scanf("%d %d",&i,&e);
insert(&L,i,e);print(L);break;
}
case 8:
{
int e,i;
printf("输入删除的位置\n");
scanf("%d",&i);
deletes(&L,i,&e);print(L);break;
}
case 9:break;break;
default:printf("error!\n");
}
}
printf("goodbye\n");
return 0;
}