1. 程式人生 > >線性表的建立與使用

線性表的建立與使用

我學的是資料結構這本書,開篇就是線性表,剛接觸的時候真的事一竅不通,後來看了不少的部落格才慢慢明白,下面是我的線性表程式碼,把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;
}