2.1線性表

成為大牛發表於2020-09-27

2.1.1多項式的表示

f(x)=a0+a1x+…+a[n-1]*x^(n-1)+ a[n]*x的n次方
如何表達 :A[i]
指數i
多項式項數n

順序儲存結構

1.直接表示

令n=i
在這裡插入圖片描述
問題:表示x+x^345的空間資源過於浪費

2.只表示非零項,將多項式項數看成二元表(n,A[i])

在這裡插入圖片描述用結構陣列表示:陣列分量是由指數,係陣列成的結構

3.運算方便
按照指數大小有序儲存
在這裡插入圖片描述

連結串列結構儲存非零項

連結串列包括每個結點儲存多項式中的一個非零項;包括係數和指數兩個資料域和一個指標域

typedef struct PolyNode *Polynomial; 
struct PolyNode{  
	int A;  
	int n;  
	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

額外補充

摘自:
https://blog.csdn.net/Poo_Chai/article/details/100605509

typedef   struct   Student2   
    {   
    int   a;   
    }stu2;//stu2是一個結構體型別=struct Student   
 

stu2必須先 stu2 s2;
    然後 s2.a=10;

主要操作的實現

補充:malloc是動態記憶體分配函式。

a=(char*)malloc(100*sizeof(char));//使用malloc分配記憶體的首地址,然後賦值給a

1.初始化

List MakeEmpty()
{
	List ptrL;
	ptrL = (List)malloc(sizeof(stuct LNode));
	ptrL->Last = -1;
	return ptrL
}

2.查詢元素位置

int Find(ElementType h,List ptrL){
	int i = 0;
	while(i <= ptrL->Last && h!=ptrL->Data[i]){
		i++;
	}
	if (h!=ptrL->Data[i])
		return i;//找到後返回儲存位置
	else
		return -1;
	
}

3.插入(第i(1<=i<=n+1)個位置上插入一個值為x的新元素)
在這裡插入圖片描述
從最後一個開始往後挪

void Insert(ElementType X,int i, List PtrL){
{
	int j ;
	//表滿
	if(PtrL->Last = Maxsize-1)
		return;
	//滿足(1<=i<=n+1)
	if(i<1 && i>PtrL->Last)
		return;
	//交換
	for(j = Maxsize+1;j>i; j--){
		PtrL->Data[j+1]=PtrL->Data[j];
	PtrL->Data[i]=X;
	PtrL->Last++;
	return;
	}
}

4.刪除第i(1<=i<=n)個位置上的元素
在這裡插入圖片描述
注意第i個位置和陣列從零開始

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[j-1]=PtrL->Data[j];
	PtrL->Last--;
	return;
	}
}

鏈式儲存結構

不要求邏輯上相鄰的兩個元素物理上也相鄰;通過‘鏈’建立邏輯關係

typedef struct Lnode* List;
struct Lnode{
	ElementType Data;
	List Next;
}
struct Lnode L;
List PtrL;

求長度

int Length(List PtrL)//List PtrL為頭指標
{
	List p = PtrL;
	int j =0;
	while(p){
	p=p->next;
	j++;
	}
	return j;
}

查詢

1.按序號查詢

List FindKth(int K ,List PtrL)
{
	List p = PtrL;
	int i = 1;
	while (p!=null && K<i)
	{
		p=p->next;
		i++;
	}
	if(K = i) return p;
	else return null;
}

按值查詢

List FindKth(ElementType X ,List PtrL){
	List p = PtrL;
	while(p!=null && X!=p->Data)
	{
	p=p->next;
	}
	return p ;
}

在這裡插入圖片描述
3.插入(在第i-1(1<=i<=n+1)個結點後插入一個值為x的新節點)
在這裡插入圖片描述
1.先造一個新節點,用s指標指向
2.p指向第i-1個節點
3.將新節點尾部接p->next
4.p指向s

List Insert(ElementType X,int i,List PtrL)
{	List p,s;
	if(i==1){
	s = (List)malloc(sizeof(struct LNode));
	s->next= PtrL;//PtrL頭指標
	s->data=X;
	return s;
	}
	p=FindKth(i-1,PtrL);//查詢第i-1個結點
	if(p==null){
		return null;
	}
	else{
		s = (List)malloc(sizeof(struct LNode));
		s->data = X;
		s-> next = p->next;
		p->next = s;
		return PtrL;
	}
}

4.刪除(刪除連結串列的第i (1<i<n)個位置上的結點)

在這裡插入圖片描述

List Delete (int i,List PtrL)
{
	List p,s;
	if (i==1){
		s=PtrL;
		if(PtrL = null) return null;//先檢查PtrL頭結點是否為空
		else PtrL = PtrL->next;
		free(s);
		return PtrL;
	}
	p=FindKth(i-1,PtrL);//查詢第i-1個結點
	if(p==null)                return null;
	elseif(p->next=null) return null;
	else{
	s = p->next;
	p->next = p->next->next;
	free(s);
	return PtrL;
	}
	
}

相關文章