線性表的陣列實現和連結串列實現
阿新 • • 發佈:2019-02-15
線性表的順序儲存實現
線性表的鏈式儲存實現//線性表用陣列來實現 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; } }