天天看點

C語言-資料結構線性表(順序存儲)代碼

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include <time.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INEEASTBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Status;
typedef struct
{
    char *name;
    int number;
    int data;
}ElemType;
typedef struct
{
    ElemType *elem;//存儲空間基址
    int length;//目前長度
    int listsize;//目前配置設定容量
}SqList;

Status InitList_Sq(SqList *L)//初始化L
{
    L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L) exit(OVERFLOW);
    L->length=0;
    L->listsize=LIST_INIT_SIZE;
    return OK;
}
Status DestroyList(SqList *L)//銷毀線性表
{
    while(L->length>0)
    {
        free(L->elem);
        --L->length;
    }
    free(L);
    return OK;
}

Status ClearList(SqList *L)//清空線性表
{
    if(0 == ListEmpty(L))
    {
        L->length=0;
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

int ListLength(SqList L)//順序表L長度
{
    return L.length;
}

Status ListEmpty(SqList L)//判斷L是否為空
{
    if(0 == L.length)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

ElemType GetElem(SqList L,int i)//傳回L中的第i個元素
{
    if(i<1 || i>L.length) return;
    return (L.elem[i-1]);
}

int LocateElem(SqList L,ElemType e)//傳回L中第一個與e元素相同的位置
{
    int i=0;
    for(i=0;i<L.length;++i)
    {
        if(e.number==L.elem[i].number && e.data==L.elem[i].data)
        {
           return i+1;
        }
    }
    return 0;
}

ElemType PriorElem(SqList L,ElemType cur_e)//傳回L中cur_e元素的前驅
{
    if(LocateElem(L,cur_e)<=1) return;
    return L.elem[LocateElem(L,cur_e)-2];
}

ElemType NextElem(SqList L,ElemType cur_e)//傳回L中cur_e元素的後繼
{
    if(LocateElem(L,cur_e)<=0 || LocateElem(L,cur_e)>=L.length) return;
    return L.elem[LocateElem(L,cur_e)];
}

Status ListInsert_Sq(SqList *L,int i,ElemType e)//向順序表L插入資料
{
    ElemType *p,*q;
    if(i<1 || i>L->length+1)return ERROR;
    if(L->length>L->listsize)
    {
        ElemType *newbase=(ElemType*)realloc(L->elem,(L->listsize+LIST_INIT_SIZE)*sizeof(ElemType));
        if(!newbase) exit(OVERFLOW);
        L->elem=newbase;
        L->listsize+=LISTINCREMENT;
    }
    q=&(L->elem[i-1]);
    for(p=&(L->elem[L->length-1]);p>=q;--p)
    {
        *(p+1)=*p;
    }
    *q=e;
    ++L->length;
    return OK;
}

Status ListDelete_Sq(SqList *L,int i,ElemType e)//删除資料
{
    ElemType *p,*q;
    if(i<1 || i>L->length) return ERROR;
    p=&(L->elem[i-1]);
    e=*p;
	printf("DeleteNode:\t");
	printf("%d\t%d\n",e.number,e.data);
    q=L->elem+L->length-1;
    for(++p;p<=q;++p)
    {
        *(p-1)=*p;
    }
    --L->length;
    return OK;
}

Status ListTraverse(SqList *L, int (*visit)(ElemType e))
{
   int i, ret;
   for (i = 0; i < L->length; ++i)
   {
       ret = visit(L->elem[i]);
       if (ret != 0)
        return ret;
   }
   return ERROR;
}

int main()
{
    srand((int) time(0));
    SqList L;
    ElemType e;
    int k=0;
    InitList_Sq(&L);
    for(k=0;k<10;k++)
    {
        e.number=k;
        e.data=rand()%100;
        ListInsert_Sq(&L,k+1,e);
    }
	printf("InitListNode:\n");
    for(k=0;k<L.length;++k)
    {
        printf("\t%d\t%d\n",L.elem[k].number,L.elem[k].data);
    }
    printf("ListLength:%d\n",ListLength(L));
	ListDelete_Sq(&L,rand()%10,e);
	printf("DeleteListNode:\n");
	for(k=0;k<L.length;++k)
    {
        printf("\t%d\t%d\n",L.elem[k].number,L.elem[k].data);
    }
    DestroyList(&L);
    printf("DestroyList:\n");
    for(k=0;k<L.length;++k)
    {
        printf("\t%d\t%d\n",L.elem[k].number,L.elem[k].data);
    }
}
           

github位址:https://github.com/lcafe8/DataStructure

繼續閱讀