天天看點

線性表 順序存儲 C語言實作

線性表 順序存儲 C語言實作

關于線性表8個基本操作的c語言實作.

[注意]

  1. 順序表用數組表示 線性表位序從1開始,數組元素下标從0開始.
  2. 順序表插入删除 判斷插入,删除位置是否合法的表示方法.
#include<stdio.h>

//SqList 順序表
#define MaxSize 50


//定義順序表
typedef struct{
	int data[MaxSize];  //順序表元素
	int length;			//順序表目前長度
}SqList;


//1.順序表删除  删除順序表第i個位置的元素,傳回值是e
bool ListDelete(SqList *L,int i,int *e){
//1)删除前----判斷插入位置是否合法 
	if(i<1 && i>L->length){   //j将順序表存儲在數組中
		return false;
	}
//2)删除中----找到要删除元素的位置并将值賦給e
	*e = L->data[i-1];
//3)删除後----i位置後的元素前移
	for(int j = i;j<L->length;j++){
		L->data[j-1] = L->data[j];
	}
	L->length--;
	return true;

}

//2.初始化  
int InitSqList(SqList *p){
	(*p).length = 0;
	return 1;
}

//3.插入   線性表 位置  資料
bool ListInsert(SqList *p,int i,int e){
	//1)插入前 --檢查插入位置是否合法
	if(i>(*p).length+1 || i<1)
		return false;
	if((*p).length>MaxSize)
		return false;
	//2)插入中 -- i位置後元素後移  插入位置  線性表長度+1
	for(int j=(p->length);j>=i;j--){
		(*p).data[j]=(*p).data[j-1];
	}
	p->data[i-1] = e;
	p->length++;
	return true;
}

//4.判斷已存在的線性表是否為空   通過長度
int ListEmpty(SqList L){
	if(L.length==0){
		return 1;
	}else{
		return 0;
	}
}

//5.清空線性表
int ClearList(SqList *L){
	L->length=0;
	return 1;
}

//6.線性表周遊
int ListTraverse(SqList L)
{
	int i;
    for(i=0;i<L.length;i++)
          printf(" %d ",L.data[i]);
    printf("\n");
    return 1;
}

//7.擷取指定位置元素
int GetElem(SqList L,int i, int *e){
	//1)查找位置是否合法
	if(i>L.length ||i<1)
		return 0;
	//2)進行查找
	*e=L.data[i-1];
	return 1;
}

//8.擷取元素所在的位序  傳回0查找失敗
int LocateElem(SqList L,int e){	
	int i;
	if(L.length=0)
		return 0;
	for(i=0;i<L.length;i++){
		if(L.data[i]=e)
			break;
	}
	if(i>=L.length)
		return 0;
	return i+1;


}

int main(){
	SqList L,Lb;

	int i,j,k;
	int e;

	i=InitSqList(&L);
	if(i=1){
	printf("初始化成功\n");
	printf("初始化線性表長度:%d\n",L.length);
	}
	
	for(j=1;j<=5;j++){  
	ListInsert(&L,1,j);
	}
	printf("\n L依次插入1-5,結果為:\n");
	for(i=0;i<5;i++){
	printf(" %d ",L.data[i]);
	}
	printf("此時長度為:%d\n",L.length);

	i=ListEmpty(L);
	if(i=1){
	printf("線性表為空\n");
	}else{
	printf("線性表不為空\n");
	}
	
	i=ClearList(&L);
	if(i=1){
	printf("線性表清除成功\n");
	}else{
	printf("線性表清除失敗\n");
	}

	ListInsert(&L,1,0);
	printf("L表頭插入0後:L.data:\n");
	ListTraverse(L);

	i=GetElem(L,1,&e);
	if(i=1){
	printf("第1個元素的值:%d\n",e);
	}else{
	printf("查找元素不存在\n");
	}

	 for(j=3;j<=4;j++)
    {
            k=LocateElem(L,j);
            if(k)
                    printf("第%d個元素的值為%d\n",k,j);
            else
                    printf("沒有值為%d的元素\n",j);
    }

    i=InitSqList(&Lb);
    for(j=6;j<=15;j++)
        i=ListInsert(&Lb,1,j);
	printf("插入10個元素後,依次輸出Lb的元素:");
    ListTraverse(Lb); 
    j=5;
    ListDelete(&Lb,j,&e); /* 删除第5個資料 */
    printf("删除第%d個的元素值為:%d\n",j,e);
 
    printf("删除後依次輸出Lb的元素:");
    ListTraverse(Lb); 



	return 0;
}