1. 程式人生 > >C語言順序表的插入刪除

C語言順序表的插入刪除

首先宣告一個順序表的結構 (陣列的第一個元素是0,但是順序表的第一個一般 從1(人為設定)開始)

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

#define MAXSIZE 10
#define OK	  1
#define FALSE 0 

typedef int Elemtype;
typedef bool Status;

typedef struct list
{
	Elemtype *elem;
	int len;        //資料個數
	int listsize;   //順序表長度
}List;

listsize 代表這個順序表的最大容量,可以隨時擴容

len 代表在你建立的這個順序表中有幾個有效的資料,總是小於等於listsize

一、初始化順序表屬性

void list_init(List *L)
{
	L->elem=(Elemtype *)malloc(MAXSIZE*sizeof(Elemtype));//開闢空間
	if(L->elem==NULL)//判斷空間是否開闢成功
	{
		printf("malloc fail\n");
		exit(0);
	}

	L->len=0;	//初始化資料有效資料為0
	L->listsize=MAXSIZE;	//初始化陣列長度為MAXSIZE
}

二、順序表的插入

Status list_insert(List *L,int i,Elemtype data)
{
	Elemtype *base,*insert,*p;
	if(i<1 || i>L->len+1 || L==NULL)
	{
		printf("位置輸入錯誤\n");
		return FALSE;
	}
	if(L->len > L->listsize)
	{
		base=(Elemtype *)realloc(L->elem,(L->listsize+MAXSIZE)*sizeof(Elemtype));//動態擴容
		L->elem=base;
		L->listsize+=MAXSIZE;//更新順序表大小
	}
	insert=&(L->elem[i-1]);//目標指標指向要插入的目標地址
	  //指向最後一個元素的地址
	for(p=L->elem + L->len-1;p>=insert;p--)
	{
		*(p+1)=*p;
	}
	*insert=data;
	L->len++;
	return OK;
}

三、刪除 

Status delete_list(List *L,int i)
{
	ElemType *q,*delete_i;
	if(L==NULL||i<0||i>L->len)
	return FALSE;
	delete_i=&(L->elem[i-1]);//用指標指向要刪除位置的地址
	q=L->elem + L->len-1;    //q指標指向順序表最後一個位置的地址   首地址加上陣列長度就是最後一個元素地址
	for(delete_i=delete_i+1;delete_i<=q;++delete_i)//從刪除位置的地址的下一個元素開始,每個往前移動一位
	{
		*(delete_i-1)=*delete_i;		//前一個位置等於後一個
	}
	L->len--;
	
	return OK;
}

 

 全部程式

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

#define MAXSIZE 10
#define OK	  1
#define FALSE 0 

typedef int Elemtype;
typedef bool Status;

typedef struct list
{
	Elemtype *elem;
	int len;
	int listsize;
}List;


void list_init(List *L)
{
	L->elem=(Elemtype *)malloc(MAXSIZE*sizeof(Elemtype));//開闢空間
	if(L->elem==NULL)//判斷空間是否開闢成功
	{
		printf("malloc fail\n");
		exit(0);
	}

	L->len=0;	//初始化資料有效資料為0
	L->listsize=MAXSIZE;	//初始化陣列長度為MAXSIZE
}

Status list_insert(List *L,int i,Elemtype data)
{
	Elemtype *base,*insert,*p;
	if(i<1 || i>L->len+1 || L==NULL)
	{
		printf("位置輸入錯誤\n");
		return FALSE;
	}
	if(L->len > L->listsize)
	{
		base=(Elemtype *)realloc(L->elem,(L->listsize+MAXSIZE)*sizeof(Elemtype));
		L->elem=base;
		L->listsize+=MAXSIZE;
	}
	insert=&(L->elem[i-1]);//目標指標指向要插入的目標地址
	  //指向最後一個元素的地址
	for(p=L->elem + L->len-1;p>=insert;p--)
	{
		*(p+1)=*p;
	}
	*insert=data;
	L->len++;
	return OK;
}

Status list_delete(List *L,int i)
{
	Elemtype *aim,*p;
	if(i<0 || i>L->len)
	{
		printf("位置輸入錯誤\n");
		return FALSE;
	}
	aim=&(L->elem[i-1]);//目標指標指向要刪除的目標地址
	p=(L->elem+L->len-1); //指向最後一個元素的地址
	for(aim=aim+1;aim<=p;++aim) //目標地址滑動刪除
	{
		*(aim-1)=*aim;
	}
	L->len--;
	return OK;
}
void show_list(List *L)
{
	int i;
	for(i=0;i<L->len;i++)
	{
		printf("elem[%d]=%d\n",i+1,L->elem[i]);
	}
	printf("\n");
}
int main()
{
	int i;
	list L;
	list_init(&L);
	for(i=0;i<10;i++)
	{
		list_insert(&L,i+1,i+1);
	}
	printf("插入前的順序表\n");
	show_list(&L);

	printf("插入後的順序表  在5位置插入99\n");
	list_insert(&L,5,99);
	show_list(&L);

	printf("刪除後的順序表  把5位置刪除\n");
	list_delete(&L,5);
	show_list(&L);
	return 0;
}