數據結構手把手教學——順序表

一、線性表的特點

線性表
1、邏輯結構:①具有線性結構,有表頭(沒有前驅)、有表尾(沒有後繼)。②有且只有一個直接前驅和一個直接後繼。
2、操作規則:任意位置插入和刪除數據。

二、順序表

1、順序表和線性表的關係:順序表是線性表的順序存儲結構
順序表結構
last:

①非空:表示最後一塊數據的下標。
②空:last = -1


三、用C語言實現順序表

1、構造存儲結構

#define SIZE 8
typedef int datatype;
typedef struct seqlist{
	datatype data[SIZE];
	int last;
}seq_list, *seq_plist;

2、初始化

初始化要完成的工作:①申請一塊空間。②設置last = -1。

/* 初始化 */
void init_seqlist(seq_plist *list)
{
	*list = (seq_plist)malloc(sizeof(seq_list));	/* 申請內存空間 */
	if (NULL == *list)
	{
		printf("申請內存失敗\n");
		perror("malloc");	/* 打印申請內存失敗的原因*/
		exit(1);			/* 讓當前程序結束 */
	}
	
	(*list)->last = -1;
}

3、插入數據

①確定插入的位置
②移動舊的數據
③插入新的數據
④last++;

(1)、如下圖所示,在位置3後面插入一個新的數據,插入前last = 5。
在位置3後面插入數據
(2)、如下圖所示,插入新數據後,last = 6。
插入數據後

/* 插入數據
   list:順序表
   i:新數據插入的位置
   data:插入的新數據
 */
void insert_seqlist(seq_plist list, int i, datatype data)
{
    int j = 0;

    /* 從位置i開始將順序表的數據往後移動 */
    for (j = list->last; j >= i; j--)
    {
        list->data[j+1] = list->data[j];
    }

    list->data[i] = data; /* 將data插入到i的位置 */
    list->last++;   /* 因爲last表示最後一個數據的下標,因此需要將last加1*/
}

4、刪除數據

①確定要刪除數據的位置。
②移動數據
③last–

如下圖所示,刪除數據前last爲5。
刪除數據前
如下圖所示,刪除數據後last爲4。
刪除數據後

/* 刪除數據
   list:順序表
   i:刪除數據的位置
 */
void delete_seqlist(seq_plist list, int i)
{
    int j = 0;

    /* 將位置i後面的數據全部往前面移動一個位置 */
    for (j = i; j < list->last; j++)
    {
        list->data[j] = list->data[j+1];
    }

    list->last--; /* 因爲last表示最後一個數據的下標,因此需要讓last減去1 */
}

5、判斷順序表是否爲空

判斷數據是否爲空,只需判斷last是否爲-1。

/* 判斷順序表是否爲空
   list:順序表
 */
void isempty_seqlist(seq_plist list)
{
    if (-1 == list->last)
    {
        return true;
    }
    else
    {
        return false;
    }
}

6、判斷順序表是否已經滿

判斷順序表是否已經滿,只需判斷last是否爲SIZE - 1。

/* 判斷順序表是否已滿
   list:順序表
 */
bool isfull_seqlist(seq_plist list)
{
    if ((SIZE - 1) == list->last)
    {
        return true;
    }
    else
    {
        return false;
    }
}

四、練習題

用順序表存儲一些整數,要求如下:
①輸入正整數表示插入數據(比如輸入3表示插入3)。
②輸入負數表示刪除數據(比如輸入-2表示刪除2)。
③輸入字符表示退出程序。
④插入和刪除數據的過程中保持該順序表數據有序遞增。

1、將數據插入順序表,且保持數據有序遞增

/* 將數據插入順序表,且保持有序遞增
    list:順序表
    idata:要插入的數據
 */
void insert_data(seq_plist list, datatype idata)
{
      int i = 0;
      if(isfull_seqlist(list))
      {
          printf("順序表已滿!\n");
          return;
      }

      /* 然順序表有序遞增插入 */
      for(i = 0; i <= list->last; i++)
      {
          if(idata < list->data[i])
          {
              break;
          }
      }
	    
      insert_seqlist(list, i, idata);
}

2、將數據從順序表刪除,且保持數據有序遞

/* 將數據從順序表刪除,且保持有序遞增
    list:順序表
    ddata:要刪除的數據
 */
void delelet_data(seq_plist list, datatype ddata)
{
      int i = 0;

      if(isempty_seqlist(list))
      {
          printf("順序表爲空!\n");
          return ; 
      }

      for(i = 0; i <= list->last; i++)
      {
          if(ddata == list->data[i])
          {
              break;
          }
      }

      if(i > list->last)
      {
          printf("%d 不在順序表中!\n", ddata);
          return ;
      }
      delete_seqlist(list, i);
}

3、遍歷打印順序表

/* 遍歷打印順序表
   list:順序表
*/
void show_seqlist(seq_plist list)
{
    int i = 0;

    for (i = 0; i <= list->last; i++)
    {
        printf("%d\t", list->data[i]);
    }
}

4、主函數

int main(void)
{
    seq_plist list;
    datatype data;
    int ret = 0;

    init_seqlist(&list);  /* 初始化順序表 */

    while(1)
    {
	    printf("請輸入一個除0之外的整數:");
	    ret = scanf("%d", &data);    /* 輸入int型返回1,否則返回0 */

	    if(ret == 0)    /* 輸入爲字符,退出while循環,程序結束 */
        {               
             printf("Bye-bye!\n"); 
             break;
	    }
        else
        {
            if(data > 0)   /* 輸入爲正整數,插入數據並打印新的順序表 */
            {  
                insert_data(list, data);
                show_seqlist(list);
            }
            else if(data < 0)   /* 輸入爲負整數,刪除數據並打印新的順序表 */
            {	
                delelet_data(list, -data);
                show_seqlist(list);
            }
            else
            {
                /* code */
            }
        }
    }

    return 0;
}

5、實驗結果

(1)、輸入正整數時,增加數據且數據有序遞增:
輸入正整數插入數據
(2)、當超過8個數據時會提示順序表已滿:
順序表已滿

(3)、輸入負整數時,刪除數據,且數據有序遞增:
輸入負整數,刪除數據
(4)、如果刪除數據不在順序表中,則提示該數據不在順序表中:
數據不在順序表中

(5)、當數據刪除完之後,再刪除數據會提示順序表爲空:
順序表爲空

五、完整代碼

https://github.com/sanjaywu/DataStructure

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