1. 程式人生 > >第三章線性表之一切從增刪改查開始

第三章線性表之一切從增刪改查開始


                      首先來一點點的概念

                       一,一兩個重要的概念

                             關於概念的學習提示:看看就好,後面你熟練了再返回來看,或者當你學習了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;	
}