PTA 資料結構與演算法題目集 個人memo
阿新 • • 發佈:2021-12-22
發現我寫的程式碼真的毫不簡潔並且沒有註釋,下次一定改。。。
6-1 單鏈表逆轉 (20 分)
1 List Reverse( List L ){ 2 PtrToNode q=NULL,p=L,r; 3 4 while(p!=NULL){ 5 r=p->Next; 6 p->Next=q; 7 q=p; 8 p=r; 9 } 10 11 return q; 12 }
6-2 順序表操作集 (20 分)
1 List MakeEmpty(){ 2 List L;3 L=(List)malloc(sizeof(struct LNode)); 4 L->Last=-1; 5 return L; 6 } 7 Position Find( List L, ElementType X ){ 8 if(!L||L->Last<0) return ERROR; 9 for(int i=0;i<=L->Last;i++){ 10 if(L->Data[i]==X) return i; 11 } 12 return ERROR; 13 } 14 boolInsert( List L, ElementType X, Position P ){ 15 if(L->Last==MAXSIZE-1){ 16 printf("FULL"); 17 return false; 18 } 19 if(P>L->Last+1||P<0){ 20 printf("ILLEGAL POSITION"); 21 return false; 22 } 23 for(int i=L->Last;i>=P;i--){ 24 L->Data[i+1]=L->Data[i]; 25 } 26 L->Data[P]=X; 27 L->Last++; 28 return true; 29 } 30 bool Delete( List L, Position P ){ 31 if(P>L->Last||P<0){ 32 printf("POSITION %d EMPTY",P); 33 return false; 34 } 35 for(int i=P;i<L->Last;i++){ 36 L->Data[i]=L->Data[i+1]; 37 } 38 L->Last--; 39 return true; 40 }
6-3 求鏈式表的表長 (10 分)
int Length( List L ){ int len=0; PtrToLNode p=L; while(p){ len++; p=p->Next; } return len; }
6-4 鏈式表的按序號查詢 (10 分)
1 ElementType FindKth( List L, int K ){ 2 PtrToLNode p=L; 3 int pos=1; 4 while(pos!=K&&p){ 5 6 pos++; 7 p=p->Next; 8 } 9 if(p) return p->Data; 10 else return ERROR; 11 }
看清題目要求,位置是從1開始的。。。
6-5 鏈式表操作集 (20 分)
1 //返回線性表中首次出現X的位置。若找不到則返回ERROR; 2 Position Find( List L, ElementType X ){ 3 PtrToLNode p=L; 4 while(p){ 5 if(p->Data==X) return p; 6 p=p->Next; 7 } 8 return ERROR; 9 } 10 11 //將X插入在位置P指向的結點之前,返回連結串列的表頭。如果引數P指向非法位置,則列印“Wrong Position for Insertion”,返回ERROR; 12 List Insert( List L, ElementType X, Position P ){ 13 PtrToLNode p=L; 14 if(p==P){ 15 PtrToLNode q=(PtrToLNode)malloc(sizeof(struct LNode)); 16 q->Data=X; 17 q->Next=P; 18 return q; 19 } 20 while(p&&p->Next!=P){ 21 p=p->Next; 22 } 23 if(p){ 24 PtrToLNode q=(PtrToLNode)malloc(sizeof(struct LNode)); 25 q->Data=X; 26 q->Next=P; 27 p->Next=q; 28 return L; 29 }else { 30 printf("Wrong Position for Insertion\n"); 31 return ERROR; 32 } 33 } 34 35 //將位置P的元素刪除並返回連結串列的表頭。若引數P指向非法位置,則列印“Wrong Position for Deletion”並返回ERROR。 36 List Delete( List L, Position P ){ 37 PtrToLNode p=L; 38 if(p==P){ 39 p=P->Next; 40 free(P); 41 return p; 42 } 43 while(p&&p->Next!=P){ 44 p=p->Next; 45 } 46 if(p){ 47 p->Next=P->Next; 48 free(P); 49 return L; 50 }else { 51 printf("Wrong Position for Deletion\n"); 52 return ERROR; 53 } 54 }
不帶頭節點的連結串列,插入和刪除都要對第一個結點進行特殊處理
6-6 帶頭結點的鏈式表操作集 (20 分)
1 //建立並返回一個空的線性表; 2 List MakeEmpty(){ 3 List L=(List)malloc(sizeof(struct LNode)); 4 L->Next=NULL; 5 return L; 6 } 7 8 //返回線性表中X的位置。若找不到則返回ERROR; 9 Position Find( List L, ElementType X ){ 10 Position p=L; 11 while(p){ 12 if(p->Data==X) return p; 13 p=p->Next; 14 15 } 16 return ERROR; 17 } 18 19 //將X插入在位置P指向的結點之前,返回true。如果引數P指向非法位置,則列印“Wrong Position for Insertion”,返回false; 20 bool Insert( List L, ElementType X, Position P ){ 21 Position p=L; 22 while(p&&p->Next!=P){ 23 p=p->Next; 24 } 25 if(p){ 26 Position q=(List)malloc(sizeof(struct LNode)); 27 q->Data=X; 28 q->Next=P; 29 p->Next=q; 30 return true; 31 }else{ 32 printf("Wrong Position for Insertion\n"); 33 return false; 34 } 35 } 36 37 //將位置P的元素刪除並返回true。若引數P指向非法位置,則列印“Wrong Position for Deletion”並返回false。 38 bool Delete( List L, Position P ){ 39 Position p=L; 40 while(p&&p->Next!=P){ 41 p=p->Next; 42 } 43 if(p){ 44 p->Next=P->Next; 45 free(P); 46 return true; 47 }else{ 48 printf("Wrong Position for Deletion\n"); 49 return false; 50 } 51 }
帶頭結點的連結串列,處理更統一