天天看點

C語言實作順序表

C代碼實作順序表

打開VS2017,建立一個空的c項目,再建立如下頭檔案和c檔案,

C語言實作順序表
C語言實作順序表
C語言實作順序表

該順序表分為兩種存儲形式,一種是動态存儲,一種是靜态存儲。靜态存儲一次性申請所需空間,而動态存儲可以進行靈活申請存儲空間,二者差别不大,動态存儲無非是多了申請記憶體空間這個步驟,算法思想都差不多。以下是代碼:

靜态配置設定的頭檔案代碼:
           
#pragma once
#include<stdio.h>
#include<stdlib.h>
///靜态配置設定頭檔案
#define MAXSIZE 1000
typedef int EleType;//資料類型
typedef struct//結構體
{
	EleType Selem[MAXSIZE];//申請MAXSIZE個資料元素存儲的空間
	unsigned length;//順序表目前長度0--MAXSIZE-1
}Slist;
///定義線性表的操作函數

Slist* Init_Slist();//初始化線性表
void InsertSlist(Slist* L, unsigned i, EleType e);//在L線性表的第i個元素(邏輯位置)前插入一個元素
unsigned GetSlistLength(Slist L);//擷取線性表長度
EleType GetSElem(Slist L, unsigned i);//擷取第i個位置的元素(邏輯位置)
unsigned LocateSElem(Slist L, EleType e);//确定e線上性表的第幾個位置
void SListDelete(Slist* L, int i, EleType* e);//删除第幾個元素
void PrintSlist(Slist L);//周遊線性表
int EmptySlist(Slist L);//線性表判空
void DestroySlist(Slist* L);//釋放線性表記憶體
           
靜态配置設定.c:函數實作代碼:
           
#include"靜态配置設定.h"
///靜态配置設定的函數實作代碼
///定義線性表的操作函數
//初始化線性表
Slist* Init_Slist()
{
	Slist* L = (Slist*)malloc(sizeof(Slist));
	L->Selem[MAXSIZE] = (EleType*)malloc(MAXSIZE * sizeof(EleType));
	L->length = 0;
	return L;
}

//在L線性表的第i個元素(邏輯位置)前插入一個元素,注意這裡使用的是邏輯位置
void InsertSlist(Slist* L, unsigned i, EleType e)
{
	printf("目前長度為:%d\n", L->length);
	if (L->length >= MAXSIZE)
	{
		printf("記憶體溢出!!!\n");
	
	}
	if (i<1 || i>=MAXSIZE)
	{
		printf("非法邏輯位置!!!\n");
		
	}
	//if (L->length == 0)
	//{
	//	printf("線性表長度為0,靜态配置設定失敗");
	//	exit(0);
	//}
	if (L->length == 0)
	{
		L->Selem[L->length] = e;
		L->length++;
		printf("length=0插入元素:%d\n", L->Selem[0]);
	
	}
	else
	{
		for (unsigned j = L->length; j >= i - 1; j--)
		{
			if (j <= 0)
			{
				break;
			}
			printf("L.selem[%d]:%d\n",j-1,L->Selem[j-1]);
		
			L->Selem[j] = L->Selem[j - 1];
		}
		L->Selem[i - 1] = e;
		L->length++;
		printf("插入成功!!!\n");
	}

	return;
}
//擷取線性表長度
unsigned GetSlistLength(Slist L)
{
	return L.length;
}
//擷取第i個位置的元素(邏輯位置)
EleType GetSElem(Slist L, unsigned i)
{
	if (i<1 || i>L.length)
	{
		printf("非法邏輯位置!!!\n");
		exit(0);
	}
	return L.Selem[i-1];

}
//确定e線上性表的第幾個位置(傳回邏輯位置)
unsigned LocateSElem(Slist L, EleType e)
{
	int flag=-1;
	for (int i = 0; i < L.length-1; i++)
	{
		if (L.Selem[i] == e)
		{
			flag = i;
			break;

		}
	}
	if (flag == -1)
	{
		printf("未找到該元素位置\n");
		return flag;
	}
	return flag + 1;
}
//删除第i個元素(邏輯位置),并且把元素放在e上
void SListDelete(Slist* L, unsigned i, EleType* e)
{
	if (L->length == 0)
	{
		printf("空表不能進行删除!!!");
		exit(0);
	}
	if (i<1 || i>L->length)
	{
		printf("非法邏輯位置");
		exit("非法邏輯位置");
	}
	*e = L->Selem[i - 1];
	/*for (EleType *p = L->Selem[i]; p >=L->Selem[L->length-1]; p++)
	{
		*(p - 1) = *p;
	}*/
	
	for (int j = i; j < L->length; j++)
	{
		L->Selem[j - 1] = L->Selem[j];
	}
	L->length--;
	printf("成功删除!!!\n");
}
//周遊線性表
void PrintSlist(Slist L)
{
	for (int i = 0; i < L.length; i++)
	{
		printf("%d ", L.Selem[i]);
	}
	printf("\n");
}
//線性表判空
int EmptySlist(Slist L)
{
	if (L.length == 0)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}
//釋放線性表記憶體
void DestroySlist(Slist *L)
{
	if (!L->Selem)
		exit(0);
	free(L->Selem);
	L->length = 0;
	printf("釋放記憶體成功\n");
}
           
動态配置設定的頭檔案代碼
           
#pragma once
///動态配置設定的頭檔案
#include<stdio.h>
#include<stdlib.h>
typedef int Eletype;
#define initSize 1000
#define incSize 500
typedef struct
{
	Eletype* Delem;
	unsigned length;
	
}Dlist;
//初始化線性表
Dlist* InitDlist();
//插入元素
void InsertDlist(Dlist* L, unsigned i, Eletype e);
//求線性表長度
unsigned DlistLength(Dlist L);
//根據位置擷取線性表第i個元素,i為邏輯位置
Eletype getDelemByPos(Dlist L, unsigned i);
//确定e是線性表第幾個元素
unsigned LocateDElem(Dlist L, Eletype e);
//删除第i個元素,i為邏輯位置
void ListDeleteDelem(Dlist* L, unsigned i);
//周遊列印線性表
void PrintDlist(Dlist L);
//線性表判空
int EmptyDlist(Dlist L);
//銷毀線性表
void DestroyDlist(Dlist* L);
           
動态配置設定.c:函數實作
           
#include"動态配置設定.h"
///動态配置設定的函數實作
//初始化線性表
Dlist* InitDlist()
{
	Dlist* list = (Dlist*)malloc(sizeof(Dlist));
	list->Delem = (Eletype*)malloc(initSize * sizeof(Eletype));
	list->length = 0;
	return list;
}
//插入元素
void InsertDlist(Dlist* L, int i, Eletype e)
{
	if (L->length == initSize)
	{
		Eletype *p;
		p = (Eletype*)realloc(L->Delem, (initSize + incSize) * sizeof(Eletype));
		if (!p)
		{
			printf("記憶體配置設定失敗!!!\n");
			exit(0);
		}
		L->Delem = p;
	
	}
	if (L->length == 0)//如果線性表沒有元素,則直接給第一個位址指派
	{
		L->Delem[0] = e;
		printf("元素%d插入成功 \n", e);
		L->length ++;
		
	}
	else
	{
		if (i<1 || i>L->length)
		{
			printf("插入位置有誤!!!");
			exit(0);
		}
	
		for (int j = L->length - 1; j >= i - 1; j--)
		{
			if (j < 0)
			{
				printf(" %d小于0 ",j);
				break;
			}
			
			L->Delem[j + 1] = L->Delem[j];
		}
		L->Delem[i - 1] = e;
		printf("元素%d插入成功\n", e);
		L->length++;
	}
	

}
//求線性表長度
unsigned DlistLength(Dlist L)
{
	return L.length;
}
//根據位置擷取線性表第i個元素,i為邏輯位置
Eletype getDelemByPos(Dlist L, unsigned i)
{
	if (&L == NULL) return NULL;
	if (i<1 || i>L.length)
	{
		printf("查找位置出錯!!!");
		exit(0);
	}
	return L.Delem[i - 1];
}
//确定e是線性表第幾個元素,邏輯位置
unsigned LocateDElem(Dlist L, Eletype e)
{
	int i;
	for (i = 0; i < L.length; i++)
	{
		if (e == L.Delem[i])
		{
			break;
		}
	}
	if (i == L.length)
	{
		return -1;
	}
	else
	{
		return i + 1;
	}
}
//删除第i個元素,i為邏輯位置
void ListDeleteDelem(Dlist* L, unsigned i)
{
	if (L->length == 0) exit(0);
	if (i<1 || i>L->length)
	{
		exit(0);
	}
	for (int j = i; j < L->length; j++)
	{
		L->Delem[j - 1] = L->Delem[j];
	}
	L->length--;

}
//周遊列印線性表
void PrintDlist(Dlist L)
{
	
	for (int i = 0; i <L.length; i++)
	{
		printf("列印元素:%d", L.Delem[i]);
	}
	printf("\n");
}
//線性表判空
int EmptyDlist(Dlist L)
{
	if (L.length == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
	
}
//銷毀線性表
void DestroyDlist(Dlist* L)
{
	if (!L->Delem) { exit(0); }
	free(L->Delem);
	L->length = 0;
}
           
測試檔案頭檔案
           
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void TestSlistTest();//靜态配置設定測試
void TestDlistTest();//動态配置設定的測試
           
測試檔案.c函數實作
           
#include"測試檔案.h"
#include"靜态配置設定.h"
#include"動态配置設定.h"

void TestSlistTest()//靜态配置設定測試
{
	printf("------------------------靜态配置設定的測試--------------------\n");
	Slist* SL = Init_Slist();
	InsertSlist(SL, 1, 10);
	InsertSlist(SL, 1, 20);
	InsertSlist(SL, 1, 30);
	InsertSlist(SL, 1, 40);
	InsertSlist(SL, 1, 50);
	InsertSlist(SL, 1, 60);
	PrintSlist(*SL);
	EleType e = GetSElem(*SL, 2);
	printf("e:%d\n", e);
	unsigned pos = LocateSElem(*SL, 50);
	printf("pos:%d\n", pos);
	EleType* del = (EleType*)malloc(sizeof(EleType));
	SListDelete(SL, 2, del);
	PrintSlist(*SL);
	DestroySlist(SL);
	printf("------------------------靜态配置設定的測試--------------------\n");
}
void TestDlistTest()//動态配置設定的測試
{
	printf("------------------------動态配置設定的測試--------------------\n");
	Dlist* DL = InitDlist();
	printf("%d\n",EmptyDlist(*DL));//判斷是否為空
	InsertDlist(DL, 1, 20);
	InsertDlist(DL, 1, 30);
	InsertDlist(DL, 1, 40);
	InsertDlist(DL, 1, 50);
	InsertDlist(DL, 1, 90);
	PrintDlist(*DL);
	InsertDlist(DL, 2, 99);
	PrintDlist(*DL);
	DestroyDlist(DL);
	printf("------------------------動态配置設定的測試--------------------\n");
}
           
最後的順序表.c檔案:
           
#include"測試檔案.h"



int main()
{
	TestSlistTest();//靜态配置設定的測試
	TestDlistTest();//動态配置設定的測試
	system("pause");
}
           

#以上就是實作順序表的操作,如有問題,歡迎指正。

繼續閱讀