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 }
带头结点的链表,处理更统一
浙公网安备 33010602011771号