题目1:设计一个高效的算法,从顺序表L中删除所有元素值介于x和y之间的所有元素,要求空间复杂度为O(1),即算法最多只额外使用一个元素空间。函数原型如下所示:
int SListDelXY(SeqList *L,ElemType x,ElemType y)
完整程序实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 #define OK 1; #define False 0; typedef int ElemType; typedef struct //定义线性表 { ElemType elem[MAXSIZE]; int last; }SeqList; void InitialSList(SeqList *L) { int i=0; printf("Please input int Xing numbers,and input -1 means endinput: \n"); do { scanf("%d",&(L->elem[i])); i++; } while((L->elem[i-1])!=-1); L->last=i-1; } int SListDelXY(SeqList *L,ElemType x, ElemType y) { if(L->last) { int i; for(i=0;i<(L->last);i++) { if((L->elem[i])>x && (L->elem[i])<y) { int j; for(j=i;j<(L->last-1);j++) L->elem[j]=L->elem[j+1]; i--; (L->last)--; } } return OK; } else return False; } void printSList(SeqList L) { int i; for(i=0;i<(L.last);i++) { printf("%d ",L.elem[i]); } putchar('\n'); } int main() { SeqList a; InitialSList(&a); printf("Please input two numbers,and the first one < the next: \n"); int x,y; scanf("%d %d",&x,&y); if(SListDelXY(&a,x,y)) printSList(a); else printf("ERROR! \n"); system("pause"); return 0; }
|
实现结果如图:
正确答案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| int SListDelXY(SeqList *L,ElemType x,ElemType y) { int i,j; if(!L || x>y) { puts("参数错误"); return ERROR; } i=j=0; while(j<=(L->last)) { if((L->elem[j])>=x && (L->elem[j])<=y) j++; else L->elem[i++]=L->elem[j++]; } L->last=i-1; return OK; }
|
题目2:已知顺序表L中的元素为int类型,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,将L中的奇数元素都排在前面,偶数元素都排在后面。函数原型如下所示:
int AdjustSqlist(SeqList *L)
完整程序实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 #define OK 1; #define False 0;
typedef int ElemType; typedef struct //定义线性表 { ElemType elem[MAXSIZE]; int last; }SeqList; void InitialSList(SeqList *L) { int i=0; printf("Please input int Xing numbers,and input -1 means endinput: \n"); do { scanf("%d",&(L->elem[i])); i++; } while((L->elem[i-1])!=-1); L->last=i-1; } int AdjustSList(SeqList *L) { if(L->last) { int count=0,i; for(i=0;i<(L->last);i++) { if((L->elem[i])%2) { ElemType t=L->elem[i]; L->elem[i]=L->elem[count]; L->elem[count]=t; count++; } } return OK; } else return False; } void printSList(SeqList L) { int i; for(i=0;i<(L.last);i++) { printf("%d ",L.elem[i]); } putchar('\n'); } int main() { SeqList a; InitialSList(&a); if(AdjustSList(&a)) printSList(a); else printf("ERRPR! \n"); system("pause"); return 0; }
|
实现结果如图:
正确答案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| int AdjustSqlist(SeqList *L) { int i=0,j; if(!L) return ERROR; j=L->last; while(i<j) { while((L->elem[i])%2 != 0 && i<j) i++; while((L0>elem[j])%2 == 0 && i<j) j--; if(i<j) { int t=L->elem[i]; L->elem[i]=L->elem[j]; L->elem[j]=t; } } return OK; }
|
题目3:已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析所编写算法的时间复杂度。函数原型如下所示:
int ListDelRange(LinkList L,int mink,int maxk)
完整程序实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 #define OK 1; #define False 0;
typedef int ElemType; typedef struct Node //定义线性表为单链表 { ElemType data; struct Node * next; }Node, *LinkList; void InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(Node)); (*L)->next=NULL; } void CFTail(LinkList L) { Node *r,*s; int i=1; r=L; ElemType c; printf("Please input int Xing numbers,and input -1 means endinput: \n"); do { scanf("%d",&c); if(c!=-1) { s=(Node *)malloc(sizeof(Node)); s->data=c; r->next=s; r=s; } else { i=0; r->next=NULL; } } while(i); } int ListDelRange(LinkList L, int mink, int maxk) { Node *r,*s; r=L; s=L; if(r->next!=NULL) { r=r->next; for(;r->next!=NULL;r=r->next) { if((r->data)>mink && (r->data)<maxk) { s->next=r->next; r=s; } else s=r; } if((r->data)>mink && (r->data)<maxk) { s->next=r->next; } return OK; } else return False; } void printLList(LinkList L) { Node *r; r=L->next; while(r->next!=NULL) { printf("%d ",r->data); r=r->next; } printf("%d ",r->data); putchar('\n'); } int main() { LinkList L; InitList(&L); CFTail(L); printf("Please input two numbers,and the first one < the next: \n"); int mink,maxk; scanf("%d %d",&mink,&maxk); if(ListDelRange(L,mink,maxk)) printLList(L); else printf("ERROR! \n"); free(L); system("pause"); return 0; }
|
实现结果如图:
正确答案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| int ListDelRange(LinkList L,int mink,int maxk) { Node *pre,*p; if(mink>=maxk || !L) return ERROR; pre=L; p=L->next; while(p && (p->data)<maxk) { if((p->data)>mink) { pre->next=p->next; free(p); p=pre->next; } else { pre=pre->next; p=p->next; } } return OK; }
|
题目4:假设两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,编写算法,将A表和B表归并成一个按元素值递减有序排列的线性表C,要求利用原A表和B表的节点空间存放表C(提示:用头插法)。函数原型如下所示:
LinkList MergeLinkListR(LinkList LA, LinkList LB)
完整程序实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 #define OK 1; #define False 0;
typedef int ElemType; typedef struct Node //定义线性表为单链表 { ElemType data; struct Node * next; }Node, *LinkList; void InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(Node)); (*L)->next=NULL; } void CFTail(LinkList L) { Node *r,*s; int i=1; r=L; ElemType c; printf("Please input int Xing numbers,and input -1 means endinput: \n"); do { scanf("%d",&c); if(c!=-1) { s=(Node *)malloc(sizeof(Node)); s->data=c; r->next=s; r=s; } else { i=0; r->next=NULL; } } while(i); } LinkList MergeLinkListR(LinkList LA, LinkList LB) { Node *r,*s,*t; LinkList LC; r=LA->next; s=LB->next; LC=LA; LC->next=NULL; for(;r!=NULL && s!=NULL;) { if((r->data)<(s->data)) { t=(Node *)malloc(sizeof(Node)); t->data=r->data; t->next=LC->next; LC->next=t; r=r->next; } else { t=(Node *)malloc(sizeof(Node)); t->data=s->data; t->next=LC->next; LC->next=t; s=s->next; } } if(r) { for(;r!=NULL;) { t=(Node *)malloc(sizeof(Node)); t->data=r->data; t->next=LC->next; LC->next=t; r=r->next; } } else { for(;s!=NULL;) { t=(Node *)malloc(sizeof(Node)); t->data=s->data; t->next=LC->next; LC->next=t; s=s->next; } } return LC; } void printLList(LinkList L) { Node *r; r=L->next; while(r->next!=NULL) { printf("%d ",r->data); r=r->next; } printf("%d ",r->data); putchar('\n'); } int main() { LinkList LA,LB; InitList(&LA); CFTail(LA); InitList(&LB); CFTail(LB); printLList(MergeLinkListR(LA,LB)); system("pause"); return 0; }
|
实现结果如图:
正确答案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| LinkList MergeLinkListR(LinkList LA,LinkList LB) { Node *pa,*pb,*r; LinkList LC; if(!LA || !LB) return ERROR; pa=LA->next; pb=LB->next; LC=LA; LC->next=NULL; while(pa!=NULL || pb!=NULL) { if(pa && (!pb || (pa->data)<(pb->data))) { r=pa->next; pa->next=LC->next; LC->next=pa; pa=r; } else { r=pb->next; pb->next=LC->next; LC->next=pb; pb=r; } free(LB); return LC; } }
|
题目5:假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表某个结点的指针,试编写算法在链表中删除指针s所指结点的前驱结点,函数原型如下所示:
int DelPrior(Node *s)
完整程序实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 #define OK 1; #define False 0;
typedef int ElemType; typedef struct Node //定义线性表为单链表 { ElemType data; struct Node * next; }Node, *LinkList;
void InitCLinkList(LinkList *CL) { *CL=(LinkList)malloc(sizeof(Node)); (*CL)->next=*CL; }
void CCLinkList(LinkList CL) { Node *r,*s; ElemType c; r=CL; printf("Please input int Xing numbers,and input -1 means endinput: \n"); scanf("%d",&c); while(c!=-1) { s=(Node *)malloc(sizeof(Node)); s->data=c; r->next=s; r=s; scanf("%d",&c); } r->next=CL; }
int DelPrior(Node *s) { if(s) { Node *r; r=s->next; for(;(r->next->next)!=s;) r=r->next; r->next=s; return OK; } else return False; }
Node * FindNum(LinkList CL,ElemType c) { Node *r; r=CL; for(;(r->next)!=CL;) { r=r->next; if((r->data)!=c) continue; else break; } return r; }
void printLList(LinkList CL) { Node *r; r=CL->next; while((r->next)!=CL) { printf("%d ",r->data); r=r->next; } printf("%d ",r->data); putchar('\n'); }
int main() { LinkList CL; InitCLinkList(&CL); CCLinkList(CL); printf("Please input the number's later number you want to delete: \n"); ElemType c; scanf("%d",&c); if(DelPrior(FindNum(CL,c))) printLList(CL); else printf("ERROR! \n"); system("pause"); return 0; }
|
实现结果如图:
正确答案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| int DelPrior(Node *s) { Node *p,*pre; if(!s) return ERROR; pre=s; p=s->next; if(p==s) return ERROR; while((p->next)!=s) { pre=pre->next; p=p->next; } pre->next=p->next; free(p); return OK; }
|
完!