C語言數據結構——順序表

  數據結構的一些講解,供學習者參考,也順帶作爲複習


  線性表的順序存儲是指在內存中用地址連續的一塊存儲空間順序存放線性表的各元素,用這種存儲形式存儲的線性表稱爲順序表。因爲內存中的地址空間是線性的,因此,用物理上的相鄰實現數據元素之間的邏輯相鄰關係既是簡單又自然的。

       


將數據存儲區data和指針last封裝成一個結構體作爲順序表的類型

struct LinearList<span style="white-space:pre">		</span>/*定義順序表結構*/
{
<span style="white-space:pre">	</span>int *list;<span style="white-space:pre">			</span>/*存順序表元素*/
<span style="white-space:pre">	</span>int size;<span style="white-space:pre">			</span>/*存順序表長度*/
<span style="white-space:pre">	</span>int MaxSize;<span style="white-space:pre">		</span>/*存list數組元素的個數*/


};

順序表的初始化

/*順序表的初始化函數*/
void InitList (LIST *L,int ms)
{
<span style="white-space:pre">	</span>if((L->list=(int *)malloc(ms*sizeof(int)))==NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>printf("內存申請失敗!\n");
<span style="white-space:pre">		</span>exit(1);
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>L->size = 0;
<span style="white-space:pre">	</span>L->MaxSize = ms;
<span style="white-space:pre">	</span>printf("鏈表創建成功!\n");
}


順序表的插入算法

/*順序表的插入算法,item:記錄插入的值;rc:記錄插入的位置*/
int InsertList(LIST *L, int item, int rc)
{
	int i;
	if((L->size)>=L->MaxSize)
		return -1;				/*順序表已滿*/
	if(rc<0)					/*插入位置爲0到L->size*/
		rc = 0;
	if(rc>L->size)
		rc = L->size;
	for(i=L->size-1;i>=rc;i--)			/*將rc後面的元素後移*/
		L->list[i+1]=L->list[i];
	L->list[rc]=item;
	L->size++;
	return 0;
}

輸出順序表的所有元素

/*輸出順序表所有元素*/
void OutputList(LIST *L)
{
	int i;
	for(i=0;i<L->size;i++)
		printf("%d",L->list[i]);
	printf("\n");
}

順序表的查找算法

/*查找算法*/
int FindList(LIST *L,int item)
{
	int i;
	for(i=0;i<L->size;i++)
		if(L->list[i]==item)			/*找到相同元素,返回元素的位置*/
			return i;
		return -1;						/*無法找到,返回-1*/
}

順序表的刪除算法

/*刪除元素,item:刪除元素的值*/
int DeleteList_1( LIST *L,int item)
{
	int i,n;
	for(i=0;i<L->size;i++)				/*找到相同的元素*/
		if(item==L->list[i])
			break;
	if(i<L->size)
	{
		for(n=i;n<L->size-1;n++)
			L->list[n] = L->list[n+1];
		L->size--;
		return i;
	}
	return -1;
}

刪除順序表指定位置的元素

/*刪除指定位置的數據*/
int DeleteList_2( LIST *L,int rc)
{
	int n;
	if(rc<0||rc>L->size)
		return -1;
	for(n=rc;n<L->size-1;n++)
		L->list[n]=L->list[n+1];
	L->size--;
	return 0;
}

主函數代碼,僅供學習參考

void main()
{
	LIST LL;			/*順序表*/
	int i,r,n,model;	/*i:元素值;r:插入位置;n:順序表長度;model:選擇行爲模式*/
	printf("請輸入所需鏈表的長度:\t");
	scanf("%d",&n);
	fflush(stdin);
	InitList(&LL,n);
	printf("list addr = %p\tsize = %d\tMaxSize = %d\n",LL.list,LL.size,LL.MaxSize);	
	
	while(1)
	{
		printf("請選擇你需要的操作\n【1】插入數據\n【2】查找數據\n【3】刪除特定位置的數據\n【4】刪除鏈表中的某個數據\n【5】遍歷並輸出線性表\n【6】退出\n");
		scanf("%d",&model);
		fflush(stdin);
		switch(model)
		{
		case 1:
			while(1)
			{
				printf("請輸入插入元素值:\t");
				scanf("%d",&i);
				if(i==0)
					break;
				printf("請輸入插入的位置:\t");
				scanf("%d",&r);
				if((InsertList(&LL,i,r-1))==-1)
					printf("插入失敗!");
				printf("當前線性表爲:\n");
				OutputList(&LL);
			}
			break;
		case 2:
			while(1)
			{
				printf("請輸入查找元素值:\t");
				scanf("%d",&i);
				if(i==0)
					break;
				r=FindList(&LL,i);
				if(r<0)
					printf("沒有找到\n");
				else
					printf("元素位置爲:%d\n",r+1);
			}
			break;
		case 3:
			while(1)
			{
				printf("請輸入刪除的元素位置:\t");
				scanf("%d",&r);
				if(r==0)
					break;
				i=DeleteList_2(&LL,r-1);
				if(i<0)
					printf("位置越界\n");
				else
				{
					printf("線性表爲:");
					OutputList(&LL);
				}
			}
			break;
		case 4:
			while(1)
			{
				printf("請輸入刪除的元素值:\t");
				scanf("%d",&i);
				if(i==0)
					break;
				r=DeleteList_1(&LL,i);
				if(r<0)
					printf("沒有找到該元素\n");
				else
				{
					printf("位置爲%d的元素已經刪除\n",r+1);
					printf("線性表爲:");
					OutputList(&LL);
				}
			}
			break;
		case 5:
			OutputList(&LL);
			break;
		case 6:
			exit(0);
		default:
			printf("請重新輸入:\n");
			break;
		}
	}

運行結果如下圖



需要源代碼的歡迎下載,免積分,共同學習,接下來會每天分享一篇,持續一個星期

http://download.csdn.net/detail/kevin_iot/9395161


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章