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 }

带头结点的链表,处理更统一

posted @ 2021-12-22 21:40  Encephalitis  阅读(110)  评论(0)    收藏  举报