1. 程式人生 > 其它 >資料結構C語言—線性表【順序儲存】順序表(定義結構體變數實現)

資料結構C語言—線性表【順序儲存】順序表(定義結構體變數實現)

目錄

SqList.h

#define ListSize 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE 1
#define OVERFLOW 1
typedef int Status;
typedef int DataType;
typedef int *Pt;

typedef struct
{
	DataType data[ListSize];
	DataType length;
}SqList,*PSqList;//通過靜態定義變數形式構造空的線性表L

void InitList(PSqList L);//初始化一個空的線性表L
//Status DestoryList(int* L);//銷燬線性表L
void ClearList(PSqList L);//清空線性表L

Status IsEmptyList(PSqList L);//若L為空表,則返回TRUE,否則返回FALSE
DataType ListLength(PSqList L);//返回L中資料元素個數
DataType GetElem(PSqList L,DataType i,Pt e);//用e返回L中第i個元素的值,操作成功返回OK,否則返回ERROR
DataType LocateElem(PSqList L,DataType e);//返回e在L中的位置,有該資料元素則返回其位置,否則返回0

Status PriorElem(PSqList L,DataType e,Pt proe);//若若e是L的資料元素,且不是第一個,則用proe返回它的前驅。操作成功返回OK,否則返回-6699
Status NextElem(PSqList L,DataType e,Pt nexte);//若e是L的資料元素,且不是最後一個,則用nexte返回它的後繼。操作成功返回OK,否則返回-6699
Status ListInsert(PSqList L,DataType i,DataType e);//在L第i個位置之前插入新的元素e,L長度加1,成功操作返回OK,否則返回ERROR
DataType ListDelete(PSqList L,DataType i,Pt e);//刪除L的第i個數據元素,並用e返回其值,L長度減1,操作成功返回刪除的值,否則返回ERROR

Status ListTraverse(PSqList L);//依次對L每個資料元素呼叫函式,成功遍歷返回OK,否則返回ERROR

SqList.c

# include "SqList.h"
# include <stdio.h>
void InitList(PSqList L)//構造一個空的線性表L
{
	L->length=0;
}
void ClearList(PSqList L)//清空線性表L
{
	L->length=0;
	printf("\n已執行清空線性表L!\n");
}
Status IsEmptyList(PSqList L)//若L為空表,則返回TRUE,否則返回FALSE
{
	if(L->length==0)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}
DataType ListLength(PSqList L)//返回L中資料元素個數
{
	return L->length;
}
DataType GetElem(PSqList L,DataType i,Pt e)//用e返回L中第i個元素的值,操作成功返回其值,否則返回-6699
{
	if(L->length==0||i>L->length)
	{
		return -6699;
	}
	else
	{
		return *e=L->data[i-1];
	}
}
DataType LocateElem(PSqList L,DataType e)//返回e在L中的位置,有該資料元素則返回其位置,否則返回0
{
	DataType i;
	for(i=0;i<L->length;i++)
	{
		if(L->data[i]==e)
		{
			return i+1;
		}
	}
	return 0;
}
Status PriorElem(PSqList L,DataType e,Pt proe)//若e是L的資料元素,且不是第一個,則用proe返回它的前驅。操作成功返回OK,否則返回-6699
{
	DataType i;
	i=LocateElem(L,e);
	if(i>=2)
	{
		*proe=L->data[i-1-1];
		return OK;
	}
	else
	{
		if(i==0)
		{
			*proe=-6699;
			printf("\n該元素:%d不在L中!無法找其前驅!\n",e);
			return -6699;
		}
		else
		{
			if(i==1)
			{
				*proe=-6699;
				printf("\n該元素是第一個元素,無前驅!\n");
				return -6699;
			}
		}
	}
	return -6699;
}
Status NextElem(PSqList L,DataType e,Pt nexte)//若e是L的資料元素,且不是最後一個,則用nexte返回它的後繼。操作成功返回OK,否則返回-6699
{
	DataType i;
	i=LocateElem(L,e);
	if(i>=1&&i<=L->length-1)
	{
		*nexte=L->data[i-1+1];
		return OK;
	}
	else
	{
		if(i==0)
		{
			*nexte=-6699;
			printf("\n該元素:%d不在L中!無法找其後繼!\n",e);
			return -6699;
		}
		else
		{
			if(i==L->length)
			{
				*nexte=-6699;
				printf("\n該元素是最後一個元素,無後繼!\n");
				return -6699;
			}
		}
	}
	return -66999;
}
Status ListInsert(PSqList L,DataType i,DataType e)//在L第i個位置之前插入新的元素e,L長度加1,成功操作返回OK,否則返回ERROR
{
	if(i<1||i>L->length+1)
	{
		printf("\n插入位置:%d不合法!\n",i);
		return ERROR;
	}
	else
	{
		if(ListLength(L)>=ListSize)
		{
			printf("\n該L表已滿!\n");
			return ERROR;
		}
		else
		{
			DataType k;
			for(k=L->length-1;k>=i-1;k--)
			{
				L->data[k+1]=L->data[k];
			}
			L->data[i-1]=e;
			L->length++;
			return OK;
		}
	}
}
DataType ListDelete(PSqList L,DataType i,Pt e)//刪除L的第i個數據元素,並用e返回其值,L長度減1,操作成功返回刪除的值,否則返回ERROR
{
	if(ListLength(L)==0)
	{
		printf("\n表為空,不能執行刪除元素!\n");
		return ERROR;
	}
	else
	{
		if(i>ListLength(L))
		{
			printf("刪除位置超過表長,非法刪除!\n\n");
			return ERROR;
		}
		else
		{
			*e=L->data[i-1];
			DataType k;
			for(k=i;k<L->length;k++)
			{
				L->data[k-1]=L->data[k];
			}
			L->length--;
			return *e;
		}
	}
}
Status ListTraverse(PSqList L)//依次對L每個資料元素呼叫函式,成功遍歷返回OK,否則返回ERROR
{
	DataType k;
	if(IsEmptyList(L)==1)
	{
		printf("\n遍歷失敗!表L為空!\n");
		return ERROR;
	}
	else
	{
		for(k=0;k<L->length;k++)
		{
			if(k==0)
			{
				printf("開始遍歷L:%d",L->data[k]);
			}
			else
			{
				printf(" %d",L->data[k]);
			}
		}
		printf("\n");
		return OK;
	}
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "SqList.h"
#include <windows.h>
/* 線性表——順序表【自編程式碼】 */
int main()
{
	DataType ef=-66999,n0,m,v,co=1;
	SqList L;
	printf("<————線性表的順序儲存【靜態法】————>\n\n\n");
	printf("——————初始化線性表靜態法——————\n");
	InitList(&L);//構造一個空的線性表L
	//Status DestoryList(int* L);//銷燬線性表L
	for(m=0;m<=100;m=m+10)
	{
		printf("\r");
		for(v=0;v<=co;v++)
		{
			printf("---");
			Sleep(10);
		}
		co++;
		printf(">%d%%\r",m);
		printf("\r");
		Sleep(80);
	}
	printf("\n——————初始化線性表已完成——————\n");
	printf("\n——————初始化依次插入元素——————\n");
	DataType i;
	printf("請輸入要插入的整型元素(以f結束):");
	for(i=0;i<ListSize;i++)
	{
		DataType n,k;
		k=scanf("%d",&n);
		if(k==0)
		{
			break;
		}
		else
		{
			ListInsert(&L,i+1,n);
		}
	}
	printf("——————初始化依次插入完成——————\n");
	printf("\n——————開始遍歷檢查初始化——————\n");
	ListTraverse(&L);
	printf("——————遍歷檢查初始化完成——————\n");
	printf("\n——————開始檢查表中元素數——————");
	printf("\n當前表L中元素個數為:%d\n",ListLength(&L));//返回L中資料元素個數
	printf("——————檢查表中元素數完成——————\n");
	getchar();
	printf("\n輸入要查詢的位置:");
	scanf("%d",&i);
	GetElem(&L,i,&ef);//用e返回L中第i個元素的值,操作成功返回OK,否則返回ERROR
	printf("\n當前表L中第%d個元素為:%d\n",i,ef);
	printf("\n輸入要返回其前驅的元素值:");
	scanf("%d",&i);
	printf("\n%d在表L中位置是:%d\n",i,LocateElem(&L,i));//返回e在L中的位置,有該資料元素則返回其位置,否則返回0
	PriorElem(&L,i,&ef);//若若e是L的資料元素,且不是第一個,則用proe返回它的前驅。操作成功返回OK,否則返回-6699
	printf("\n%d在表L中前驅是:%d\n",i,ef);
	printf("\n輸入要返回其後繼的元素值:");
	scanf("%d",&i);
	printf("\n%d在表L中位置是:%d\n",i,LocateElem(&L,i));//返回e在L中的位置,有該資料元素則返回其位置,否則返回0
	NextElem(&L,i,&ef);//若e是L的資料元素,且不是最後一個,則用nexte返回它的後繼。操作成功返回OK,否則返回-6699
	if(ef!=-6699)
	{
		printf("\n%d在表L中後繼是:%d\n",i,ef);
	}
	printf("\n輸入要插入的位置和插入值:");
	scanf("%d %d",&i,&n0);
	if(ListInsert(&L,i,n0)==1)//在L第i個位置之前插入新的元素e,L長度加1,成功操作返回OK,否則返回ERROR
	{
		printf("已成功插入!\n");
	}
	else
	{
			printf("插入失敗!可能是位置違規或表已滿!\n");
	}
	printf("\n——————開始遍歷檢查表資料——————\n");
	ListTraverse(&L);
	printf("——————遍歷檢查初始化完成——————\n");
	printf("\n當前表L中元素個數為:%d\n",ListLength(&L));//返回L中資料元素個數
	printf("輸入要刪除的位置:");
	scanf("%d",&i);
	if(ListDelete(&L,i,&ef))//刪除L的第i個數據元素,並用e返回其值,L長度減1,操作成功返回刪除的值,否則返回ERROR
	{
		printf("已刪除第%d個位置元素!\n",i);
	}
	ListTraverse(&L);
	printf("\n當前表L中元素個數為:%d\n",ListLength(&L));//返回L中資料元素個數
	ClearList(&L);//清空線性表L
	ListTraverse(&L);
	printf("\n當前表L中元素個數為:%d\n",ListLength(&L));//返回L中資料元素個數
	system("pause");
	return 0;
}

執行結果示例


------------------------------------------------------第一次發文章有點激動啊!-----------------------------------------------------
-----------------------------------------------------【資料結構程式碼自編練習】------------------------------------------------------
----------------------------------------------------------------【TDTX】-----------------------------------------------------------------