1. 程式人生 > 其它 >PTA 資料結構與演算法題目集 個人memo

PTA 資料結構與演算法題目集 個人memo

發現我寫的程式碼真的毫不簡潔並且沒有註釋,下次一定改。。。

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 bool
Insert( 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 }

帶頭結點的連結串列,處理更統一