1. 程式人生 > >線性表的陣列實現和連結串列實現

線性表的陣列實現和連結串列實現


線性表的順序儲存實現

//線性表用陣列來實現 
typedef struct PolyNode *Polynomial;
struct PolyNode{
	int coef;//係數 
	int expon;//exponential指數 
	Polynomial link;
};

typedef struct LNode *List;
struct LNode{
	ElementType Data[MAXSIZE];//陣列型別 
	int Last;//最後一個元素 
};
struct LNode L;
List PtrL;//線性表結構的指標 
//訪問下標為i的元素:L.Data[i]或PtrL->Data[i]
//線性表的長度:L.Last+1或PtrL->Last+1 

//1.初始化(建立空的順序表)
List MakeEmpty()
{
	List PtrL;
	PtrL=(List)malloc(sizeof(struct LNode));//產生頭結點,並使L指向頭結點 
	PtrL->Last=-1;//=0表示第一個元素,=-1表示無元素 
	return PtrL;//返回結構指標 
} 

//2.查詢
int Find(ElementType X,List PtrL)//List PtrL線性表結構的指標/線上性表中找到X所在的位置 
{
	int i=0;
	while(i<=PtrL->Last&&PtrL->Data[i]!=X)
		i++;
	if(i>PtrL->Last)
		return -1;//如果沒找到,返回-1 
	else
		return i;//找到後返回儲存位置 
} 
//查詢成功的平均比較次數為(n+1)/2,平均時間效能為O(n)

//3.插入操作實現
void Insert(ElementType X,int i,List PtrL)
{
	int j;
	if(PtrL->Last==MAXSIZE-1){//表空間已滿,不能插入 
		printf("表滿");
		return;
	}
	if(i<1||i>PtrL->Last+2){//檢查插入位置的合法性 
		printf("位置不合法");
		return;
	}
	for(j=PtrL->Last;j>=i-1;j--)
		PtrL->Data[j+1]=PtrL->Data[j];//將ai~an倒序向後移動 
		PtrL->Data[i-1]=X;//新元素插入 
		PtrL->Last++;//Last仍指向最後元素 
	return;
} 
//平均移動次數為n/2,平均時間效能為O(n)

//4.刪除操作實現
void Delete(int i,List PtrL)
{
	int j;
	if(i<1||i>PtrL->Last+1){//檢查空表及刪除位置的合法性 
		printf("不存在第%d個元素",i);
		return;
	}
	for(j=i;j<=PtrL->Last;j++)
		PtrL->Data[i-1]=PtrL->Data[i];//將ai+1~an順序向前移動 
		PtrL->Last--;//Last仍指向最後元素 
		return;
} 
//平均移動次數為n/2,平均時間效能為O(n)
線性表的鏈式儲存實現
//連結串列
typedef struct LNode *List ;
struct LNode{
	ElementType Data;
	List Next;
};
struct Lnode L;
List PtrL;

//1.求表長——連結串列遍歷 
int Length(List PtrL)//連結串列頭指標  
{
	List p=PtrL;//p指向表的第一個結點 
	int j=0;
	while(p){
		p=p->Next;//最後一個結點是NULL 
		j++;//當前p指向的是第j個結點 
	}
	return j;
} 
//時間效能為表長O(n) 

//2.查詢
//(1)按序號查詢:FindKth;
List FindKth(int K,List PtrL)
{
	List p=PtrL;//p指向表頭 
	int i=1;
	while(p!=NULL&&i<K){
		p=p->Next;
		i++; 
	}
	if(i==K)
		return p;//找到第K個,返回指標 
	else
		return NULL;//否則返回空 
} 

//(2)按值查詢
List Find(ElementType X,List PtrL)
{
	List p=PtrL;
	while(p!=NULL&&p->Data!=X)//p->Data!=X沒找到 
		p=p->Next;
	return p;
} 

//3.插入
List Insert(ElementType X,int i,List PtrL)//將X插入到PtrL的第i個位置 
{
	List p,s;
	if(i==1){//新結點插入在表頭 i-1=0,在連結串列中是不存在的,所以要做特殊處理 
		s=(List)malloc(sizeof(struct LNode));//申請填裝結點 
		s->Data=X;
		s->Next=PtrL;
		return s;//返回新表頭指標 
	}
	p=FindKth(i-1,PtrL);//查詢第i-1個結點 
	if(p==NULL){//第i-1個結點不存在,不能插入 
		printf("引數i錯誤");
		return NULL;
	}
	else{
		s=(List)malloc(sizeof(struct LNode));//申請填裝結點 
		s->Data=X;
		s->Next=p->Next;//新結點插入在第i-1個結點的後面 
		p->Next=s;
		return PtrL;
	}
} 

//4.刪除
List Delete(int i,List PtrL)
{
	List p,s;
	if(i==1){//若要刪除的是表的第一個結點 
		s=PtrL;//s指向第一個結點 
		if(PtrL!=NULL)//從連結串列中刪除 
			PtrL=PtrL->Next;
		else
			return NULL;//第一種情況是PtrL本身就是空白,這是刪除不成功 
		free(s);//釋放被刪除結點 
		return PtrL;
	}
	p=FindKth(i-1,PtrL);//查詢第i-1個結點 
	if(p==NULL){
		printf("第%d個結點不存在",i-1);
		return NULL;
	}
	else if(p->Next==NULL){
		printf("第%d個結點不存在",i);
		return NULL;
	}
	else{
		s=p->Next;//s指向第i個結點 
		p->Next=s->Next;//從連結串列中刪除 
		free(s);//釋放被刪除結點 
		return PtrL;
	}
}