今天咱們就來學習學習什麼叫做線性表,首先線性表是一種存儲結構,其他的存儲結構分別爲 樹、圖、集合
線性表又包括兩種結構,一種是順序存儲結構,一種是鏈式存儲結構,這一節講的是順序存儲結構
爲什麼叫做順序表示呢?因爲這種線性表的內部的表示方法就是順序排序的,換句話說在線性表內部存儲的元素對應的內存是挨着的,也就是這些元素在內存中是一個個排列下來的。
這種用順序存儲結構來表示的線性表定義方法如下,具體思路是我們定義一個結構體。
#define MAXSIZE 100 //表中元素的最大個數
typedef int ElemType; //元素類型
typedef struct
{
ElemType *elem; //線性表
int length; //表的實際長度
int listsize; //當前分配的存儲容量
}SqList; //順序表的類型名
可能有人會問了:爲什麼把int起了個別的名字ElemType呢?
那麼如果你想改變線性表元素的類型呢?你是不是還要一個一個找,有時候還會出現編譯錯誤,後期的維護成本是很高的,因此我們應ElemType來表示元素類型,這種元素類型我們就可以自由定義了。
可能還會有人問:爲什麼定義出來的elem是一個指針類型呢?
因爲我們是要在一個結構體裏面創造一個數組而不是一個數組每個元素都是這種結構體類型。
下面就是具體實現的一些代碼:
DS.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
SqList.h
#define SQLIST_H_INCLUDED
#include "DS.h"
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
void menu();
Status InitList_Sq(SqList &L, int n);/*初始化順序表*/
Status CreateList_Sq(SqList &L);/*建立順序表*/
void PrintList_Sq(SqList L);/*輸出順序表*/
Status DeleteList_Sq(SqList &L,int i,ElemType &e);/*刪除第i個元素*/
Status DeleteListX_Sq(SqList &L,ElemType x);/*刪除值爲x的元素*/
Status AdjustList_Sq(SqList &L);/*奇數排在偶數之前*/
Status OrderList_sq(SqList &L, int n);/*插入法生成遞增有序表*/
void MergeList_Sq(SqList La, SqList Lb, SqList &Lc );/*兩個非遞減有序表A和B,並把它們合併成一個非遞減有序表C*/
#endif // SQLIST_H_INCLUDED
SqList.cpp
#include "SqList.h"
void menu()
{
printf("\t\t\t 順序表基本操作\n\n");
printf("\t\t\t1.建 立 順 序 表\n");
printf("\t\t\t2.遍 歷 順 序 表\n");
printf("\t\t\t3.刪 除 第 i 個 元 素\n");
printf("\t\t\t4.刪 除 值 爲 x 的 元 素\n");
printf("\t\t\t5.奇 數 排 在 偶 數 之 前\n");
printf("\t\t\t6.插 入 法 生 成 遞 增 有 序 表\n");
printf("\t\t\t7.兩個非遞減有序表La和Lb合併成非遞減有序表Lc\n");
printf("\t\t\t0.退 出\n\n");
}
/*初始化順序表*/
Status InitList_Sq(SqList &L, int n)
{
L.elem=(ElemType*)malloc(n*sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);
L.length=0;
L.listsize=n;
return OK;
}
/*建立順序表*/
Status CreateList_Sq(SqList &L)
{
int n, i;
printf("請輸入順序表長度:");
scanf("%d", &n);
if(InitList_Sq(L, n))
{
printf("請輸入%d個元素:", n);
for(i = 0; i < n; i++)
{
scanf("%d", &L.elem[i]);
L.length++;
}
return OK;
}
else
return ERROR;
}
/*輸出順序表*/
void PrintList_Sq(SqList L)
{
int i;
printf("順序表中元素爲:\n");
for(i = 0; i < L.length; i++)
{
printf("%d ", L.elem[i]);
}
printf("\n");
}
/*刪除第i個元素*/
Status DeleteList_Sq(SqList &L,int i,ElemType &e)
{
ElemType *p, *q;
if( (i<1) || (i>L.length) ) return ERROR;
p = &(L.elem[i-1]);
e = *p;
q = L.elem+L.length-1;
for(++p; p <= q; ++p) *(p-1) = *p;
--L.length;
return OK;
}
/*刪除值爲x的元素,刪除成功返回OK,刪除失敗返回ERROR*/
Status DeleteListX_Sq(SqList &L,ElemType x)
{
ElemType *p, *q;
}
/*奇數排在偶數之前*/
Status AdjustList_Sq(SqList &L)
{
ElemType *p, *q;
int temp;
return OK;
}
/*插入法生成遞增有序表,有序表生成成功返回OK,失敗返回ERROR*/
Status OrderList_sq(SqList &L, int n)
{
int i, j, x; /*x表示每次待插入的元素*/
}
/*兩個非遞減有序表A和B,並把它們合併成一個非遞減有序表C*/
void MergeList_Sq(SqList La, SqList Lb, SqList &Lc )
{
ElemType *pa, *pb, *pc, *pa_last, *pb_last;
pa = La.elem; pb = Lb.elem;
Lc.listsize = Lc.length = La.length+Lb.length;
pc = Lc.elem = (ElemType *)malloc(Lc.listsize * sizeof(ElemType));
if (!Lc.elem) exit (OVERFLOW);
pa_last = La.elem + La.length - 1;
pb_last = Lb.elem + Lb.length - 1;
while (pa <= pa_last && pb <= pb_last)
{
if (*pa <= *pb) *pc++ = *pa++;
else *pc++ = *pb++;
}
while(pa <= pa_last) *pc++ = *pa++;
while(pb <= pb_last) *pc++ = *pb++;
}
main.cpp
#include "SqList.h"
int main()
{
int choice, n, i, x;
SqList L, La, Lb, Lc;
while(1)
{
menu();
printf("選擇你的操作:");
scanf("%d",&choice);
switch(choice)
{
case 1:
if(CreateList_Sq(L))
printf("順序表創建成功\n");
else
printf("順序表創建失敗\n");
break;
case 2:
PrintList_Sq(L);
break;
case 3:
printf("請輸入刪除元素的位置:");
scanf("%d", &i);
if(DeleteList_Sq(L, i, x))
printf("被刪除元素值爲:%d\n",x);
else
printf("刪除失敗\n");
break;
case 4:
printf("請輸入刪除元素值:");
scanf("%d", &x);
if(DeleteListX_Sq(L, x))
printf("刪除成功\n");
else
printf("刪除失敗\n");
PrintList_Sq(L);
break;
case 5:
AdjustList_Sq(L);
printf("新鏈表爲:\n");
PrintList_Sq(L);
break;
case 6:
printf("請輸入順序表長度:");
scanf("%d", &n);
if(OrderList_sq(L, n))
{
printf("值有序順序表爲:\n");
PrintList_Sq(L);
}
else
printf("順序表創建失敗\n");
break;
case 7:
printf("請輸入順序表La的長度:");
scanf("%d", &n);
OrderList_sq(La, n);
printf("請輸入順序表Lb的長度:");
scanf("%d", &n);
OrderList_sq(Lb, n);
MergeList_Sq(La, Lb, Lc);
printf("合併後的順序表爲:\n");
PrintList_Sq(Lc);
break;
case 0:
return 0;
default:
printf("輸入錯誤,請重新輸入\n");
}
}
}
以上都是不全面的,後續還會繼續更新~~~~~~
拜了個拜