线性表的创建与使用

我学的是数据结构这本书,开篇就是线性表,刚接触的时候真的事一窍不通,后来看了不少的博客才慢慢明白,下面是我的线性表代码,把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;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值