1. 程式人生 > >順序表的 C 語言實現

順序表的 C 語言實現

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define OVERFLOW 0
#define ERROR -1
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct 
{
//	定義陣列儲存資料元素的最大值 
	char *elem;
//	定義線性表當前長度 
	int length;
//	線性表的長度
	int listsize; 
}SqList;

//	線性表的初始化
int InitList(SqList &L)
{
	L.elem = (char *)malloc(LIST_INIT_SIZE*sizeof(char));
	if(!L.elem)
		exit(OVERFLOW);
		
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return OK;
 } 
 
// 插入
int ListInsert_Sq(SqList &L,int i,char e)
{
//	i 是要插入的位置 
//	如果要插入的位置不在順序表的範圍內就報錯 
	if(i<1 || i>L.length)
	{
		return ERROR;
	}
	
	char *newbase;
	char *p , *q;
//	如果當前長度大於了最大長度就重新分配新的空間 
	if(L.length >= L.listsize)
	{
		newbase = (char*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(char));
		if(!newbase)
			exit(OVERFLOW);
		L.elem = newbase;
		L.listsize += LISTINCREMENT;
	}
	
//	插入操作

//	q 為第 i 個元素的位置 ,即要插入的元素的位置 
q = &(L.elem[i-1]); 

//	從後往前遍歷,把 i 後的每一個元素都後移一位 
for(p=&(L.elem[L.length - 1]);p>=q;p--)
{
	*(p+1) = *p;
}

//	把要插入的元素放到 i 這個位置 
*q = e;

//順序表當前長度增加一個 
L.length++;

return OK;
 } 
 
// 刪除
int ListDelet_Sq(SqList &L,int i)
{
	int k; 
	
	if(i<1 || i>L.length)
	{
		return ERROR;
	}

	if(i<L.length)
	{
		for(k=i;k<L.length;k++)
		{
			L.elem[k-1] = L.elem[k];
		}
	}
	

	
	L.length--;
	return OK;
 } 
 
// 查詢
// x 為查詢的值 
int LocateElem_Sq(SqList L,char x)
{
	int i = 1;
	char *p;
 	p = L.elem;
 	while(i<L.length)
 	{
 		if(*p == x)
 			break;
 		else
 			p++;
 			i++;
	 }
	 
//	 返回這個位置 
	printf("%d 的位置是 %d\n",x,i);
 } 
 
// 顯示當前順序表的數值
void show(SqList L)
{
	int i;
	printf("當前順序表的數值情況:\n");
	for(i=0;i<L.length;i++)
	{
		printf("%d ",L.elem[i]);
	}
	printf("\n");
 } 
 
 main()
 {
 	int y;
 	SqList L;
 	y = InitList(L);
 	if(y == 1)
 		printf("success init\n");
 		
// 	先給順序表賦值
	for(int i=0;i<10;i++)
	{
		L.elem[i] = i;
		L.length ++ ;		
	}
	
	show(L);
 
// 	查詢一個數字 8 ,並返回它的位置
	 LocateElem_Sq(L,8); 
	 
//	 插入一個數字 10 到第八位置
	ListInsert_Sq(L,8,10);
	show(L); 
	
//	刪除一個數字 10  
	 ListDelet_Sq(L,8);
	 show(L); 
	
//	這個是地址 
//	 printf("%d\n",L);


 }