第三章線性表之一切從增刪改查開始
首先來一點點的概念
一,一兩個重要的概念
關於概念的學習提示:看看就好,後面你熟練了再返回來看,或者當你學習了java,c++的STL之後回來看這一章的時候,你會發現原來所有的一切容器,早在一百多年前,計算機專家就已經有了描述,原來一切封裝都有一定的原則,原來學習了這個課程之後,一切的容器都有一模一樣的規則!!!還是老話我很排斥概念,不過有的概念是必須知道的,有點印象之後,後面學東西會有突然的頓悟,好了,開始吧,廢話很多了。
概念1
線性表的特點:(1)存在唯一的一個被稱為“第一個”的資料元素
(2)存在唯一的一個被稱為"最後一個"的資料元素
(3)除第一個之外,集合中的每個元素只有一個前驅(前驅:就好像排隊一樣,你個子比較矮,你只看到前面哪個人排在你前面,再前面的被那個高的擋住了)
(4)除了最後一個之外,集合中的每個元素均只有一個後繼(後繼:一樣還是因為你個子矮,你只看到你後面排了誰,再後面的被擋住了)
二,線性表的順序儲存結構
#define MAXSIZE 50
typedef struct
{
int data[MAXSIZE];
int length;
}List;
前面講了一堆都不到肉,到底什麼是線性表?講得簡單一點就是一對簡單資料型別的組合,那什麼是順序儲存結構?書上說是存在計算機儲存器的一塊連續的儲存空間,如果還沒有入門計算機組成原理的,可能對這句話暈忽忽的,其實用一個簡單點的表示方法就是陣列啦,一個接著一個像排隊一樣,有人來插隊了,怎麼辦?大家都往後退一步,有人離開了,怎麼辦?大家都往前挪一步
下面我們來定義一個順序儲存結構的儲存型別,腦子裡一定要有排隊的概念
說明:上面的儲存結構中的data就是這個隊了,這個隊只能排50個人,length就是現在已經有多少個人在排隊
關於這個資料結構我們要提供幾個全域性的方法,首先,安排所有人要買東西先排隊,所以我們要先騰出一塊地方給人排隊(初始化),隊裡一個人離開了,就刪除它(刪除),隊裡來一個人靠關係來插隊了就加入它(插入),沒東西賣了,就解散這個隊伍(銷燬)。
好了下面動手這個過程
初始化:
void InitList(List *&list)
{
list =(List *)malloc(sizeof(List));
memset(list->data,0,sizeof(list->data));
list->length=0;
}
插入:
void ListInsert(List *list,int index,int value)
{
int *ptrBegin= list->data;
int *ptrEnd = ptrBegin+MAXSIZE-1;
int *ptrIndex=ptrBegin+index;
if(ptrEnd>=ptrIndex&&ptrIndex>=ptrBegin)
{
while(ptrEnd>ptrIndex)
{
*ptrEnd=*(ptrEnd-1);
ptrEnd--;
}
*ptrIndex=value;
list->length++;
}
}
刪除:
int ListDelete(List *list,int index)
{
int *ptrBegin= list->data;
int *ptrIndex=list->data+index;
int *ptrEnd=list->data+MAXSIZE-1;
int e = list->data[index];
if(ptrEnd>=ptrIndex&&ptrIndex>=ptrBegin)
{
while(ptrIndex<ptrEnd)
{
*ptrIndex=*(ptrIndex+1);
ptrIndex++;
}
list->length--;
return e;
}
return 0;
}
銷燬:
void ListDesotry(List * &list)
{
free(list);
}
為了方便大家copy玩一下,貼出整體的程式碼,不過本人的程式碼也沒有高效率,主要為了清晰易懂,大家研究研究,有bug多提提啦!
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MAXSIZE 50
typedef struct
{
int data[MAXSIZE];
int length;
}List;
void InitList(List *&list)
{
list =(List *)malloc(sizeof(List));
memset(list->data,0,sizeof(list->data));
list->length=0;
}
void ListInsert(List *list,int index,int value)
{
int *ptrBegin= list->data;
int *ptrEnd = ptrBegin+MAXSIZE-1;
int *ptrIndex=ptrBegin+index;
if(ptrEnd>=ptrIndex&&ptrIndex>=ptrBegin)
{
while(ptrEnd>ptrIndex)
{
*ptrEnd=*(ptrEnd-1);
ptrEnd--;
}
*ptrIndex=value;
list->length++;
}
}
int ListDelete(List *list,int index)
{
int *ptrBegin= list->data;
int *ptrIndex=list->data+index;
int *ptrEnd=list->data+MAXSIZE-1;
int e = list->data[index];
if(ptrEnd>=ptrIndex&&ptrIndex>=ptrBegin)
{
while(ptrEnd>ptrIndex)
{
*ptrIndex=*(ptrIndex+1);
ptrIndex++;
}
list->length--;
return e;
}
return 0;
}
void ListDesotry(List * &list)
{
free(list);
}
int main()
{
List *list;
InitList(list);
for(int i=0;i<4;i++)
{
ListInsert(list,i,i);
}
ListDelete(list,3);
for(int i=0;i<list->length;i++)
{
printf("%d\t",list->data[i]);
}
ListDesotry(list);
printf("\n");
return 0;
}