1. 程式人生 > >資料結構—順序表基本操作(c語言程式碼)

資料結構—順序表基本操作(c語言程式碼)

順序表

計算機內部儲存一張線性表是用一組連續地址記憶體單元,這種儲存結構即為順序儲存結構,這種結構下的線性表叫順序表。


順序表有兩種定義方法:

                                    1.靜態定義

                                    2.動態生成

順序表是最簡單的一種線性儲存結構,優點:構造簡單,操作方便,通過順序表的首地址(或陣列名)可直接對錶進行隨機存取

                                                       缺點:可能浪費儲存空間,插入或者刪除時候需要對後邊一系列的資料進行操作,效率低

下面舉兩個例項並附上c語言程式碼+註釋來理解

靜態順序表

/********************************************************************************
建立一個靜態的順序表存放整數,大小為10,完成以下的操作
1.輸入6個整數,打印出順序表的內容,並顯示錶中剩餘空間的個數
2.在順序表的第三個位置處插入元素0,打印出表中的內容,並顯示空間中剩餘的個數
3.再試圖插入表中第11個位置整數0,程式提示超出範圍
4.刪除表中第6個元素,最後顯示空間中剩餘的個數
*********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
/**     函式inserElem的作用:順序表Sqlist第i個位置上插入元素x,並將長度加1 */
/**     向順序表中插入元素                                                   */
/**     引數Sqlist:表首地址                                                   */
/**     引數*len:表的長度                                                     */
/**     引數i:插入元素的位置                                                 */
/**     引數x:待插入的元素值                                                 */
void insertElem(int Sqlist[] , int *len , int i , int x)
{
    int t;
    if(*len==MaxSize || i<1 || i>*len+1)  //長度為len的順序表可插入的位置為1-len+1 其餘的還有表已滿的情況均超出範圍
    {
        printf("非法插入\n");
        return;
    }
    for(t = *len-1 ; t>=i-1 ; t--)
        Sqlist[t+1] = Sqlist[t];    //將i-1後的元素順序後移一個元素的位置
    Sqlist[i-1] = x;                //插入元素
    *len  =  *len+1;                //表長加1
}

/**     函式inserElem的作用:順序表Sqlist第i個位置上插入元素x,並將長度加1 */
/**     向順序表中刪除元素                                                   */
/**     引數Sqlist:表首地址                                                   */
/**     引數*len:表的長度                                                     */
/**     引數i:插入元素的位置                                                 */
void DelElem(int Sqlist[] , int *len , int i)
{
    int j;
    if(i<1 || i>*len)
    {
        printf("非法刪除\n");
        return;
    }
    for(j =i ; j<=*len-1 ; j++)
        Sqlist[j-1] = Sqlist[j];
    *len = *len-1;
}
/**     測試函式   根據題目要求   */
int main()
{
    int Sqlist[MaxSize];
    int len;
    int i;
    for(i = 0 ; i<6 ; i++)
    {
        scanf("%d",&Sqlist[i]);
    }
    len = 6;
    for(i= 0 ; i<len ; i++)
        printf("%d\t",Sqlist[i]);
    printf("\n剩餘空間為%d\n" , MaxSize - len);
    insertElem(Sqlist , &len , 3 , 0);          //表中第三個位置插入整數0
    for(i= 0 ; i<len ; i++)
        printf("%d\t",Sqlist[i]);
    printf("\n剩餘空間為%d\n" , MaxSize - len);
    insertElem(Sqlist , &len , 11 , 0);         //表中第11個位置插入0
    DelElem(Sqlist  ,   &len , 6);              //刪除第六個元素
    for(i= 0 ; i<len ; i++)
        printf("%d\t",Sqlist[i]);
    printf("\n剩餘空間為%d\n" , MaxSize - len);
    return 0;
}
動態順序表
/********************************************
 *動態的建立一個順序表
 *初始長度10,向順序表中輸入15個整數,並列印
 *再刪除順序表中的第五個元素,打印出結果
 ********************************************/ 
#include<stdio.h>
#include<conio.h>
#define MaxSize 10
#include<bits/stdc++.h>
/* 定義一個結構體Sqlist */ 
typedef struct{
	int *elem;      	//指向順序表的首地址 
	int length;			//順序表中表的長度(表中元素的個數) 
	int listsize;		//順序表儲存空間容量 
}Sqlist;	
/* 通過一個函式initSqlist實現動態的生成一個順序表 初始化一個順序表 */
/* 引數L:Sqlist型別的指標	因為是指標所以可以在函式中直接對順序表進行操作 */
void initSqlist(Sqlist *L){
	//呼叫malloc函式動態分配一段空間,並將空間首地址賦給L的elem成員,L->elem指向順序表的首單元 
	L ->elem = (int *)malloc(MaxSize*sizeof(int));	 
	if(!L ->elem)	exit(0);
	L -> length = 0;			//置0表示表空  剛生成 
	L -> listsize = MaxSize;	//置MaxSize  表示空間大小 
}//Sqlist型別的變數L就代表了一張順序表 可以靈活操作  L->elem頭地址  L->length長度   L->MaxSize容量 

/******************** 
 *向順序表中插入元素
 *引數L :Sqlist型別的指標
 *引數i:插入元素的位置
 *引數item:插入的元素
 *********************/
void InsertElem(Sqlist *L, int i, int item){
	//向順序表L中的第i個位置插入元素item
	int *base, *insert_ptr, *p;
	if(i < 1 || i > L->length+1)	exit(0);	//非法插入 退出 
	if(L->length >= L->listsize)
	{
		//realloc函式重新追加空間 		******動態順序表的優勢********  靜態順序表記憶體大小固定不變 動態可以隨時擴充 
		base = (int *)realloc(L->elem, (L->listsize +10)*sizeof(int));
		L->elem = base;							//更新記憶體基址 
		L->listsize = L->listsize + 100;		//記憶體空間增大100單元 
	}
	insert_ptr = &(L ->elem[i-1]);				//insert_ptr為插入位置 
	for(p = &(L ->elem[L->length-1]); p >= insert_ptr; p--)
		*(p+1) =* p;							//將i-1後的元素順序後移一個元素的位置 
	* insert_ptr = item;						//在第i個位置上插入元素item 
	L->length++;								//表長+1 
} 
 
/******************** 
 *從順序表中刪除元素
 *引數L :Sqlist型別的指標
 *引數i:刪除元素的位置
 *********************/
void DelElem(Sqlist *L, int i)
{
	//從順序表L中刪除第i個元素
	int *delitem, *q;
	if(i < 1 || i > L->length)	exit(0);		//非法刪除 
	delitem = &(L->elem[i-1]);					//delitem指向第i個元素 
	q = L->elem + L->length-1;					//q指向表尾 
	for(++delitem; delitem <= q; ++delitem)*(delitem-1) =* delitem;	//將第i位置以後的元素依次前移 
	L->length--;								//表長-1 
	 
}

/******************** 
 *測試函式 
 *********************/
int main()
{
	Sqlist l;
	int i;
	initSqlist(&l);
	printf("表中資料:");
	for(i =0; i<15; i++)
		InsertElem(&l, i+1, i+1);
	for(i = 0; i<l.length; i++)
		printf("%3d",l.elem[i]);
		printf("\n刪除後的結果:");
	DelElem(&l, 5);
	for(i = 0; i<l.length; i++)
		printf("%3d",l.elem[i]);
	getche();
	
	return 0;
}