|
#include<stdio.h> void swap(int *a,int *b) { int tmp; tmp=*a; *a=*b; *b=tmp; }
void quicksort(int k[],int s,int t) { int i,j; if(s<t) { i=s; j=t+1; while(1) { do i++; while(!(k[s]>=k[i] || i==t));//重復執行i++操作 do j--; while(!(k[s]<=k[j] || j==s));//重復執行j--操作
if(i<j) swap(&k[i],&k[j]); //交換k[i]和k[j]的位置 else break; } swap(&k[s],&k[j]); //交換基準元素與k[j]的位置 quicksort(k,s,j-1); //遞歸排序基準元素前面的子序列 quicksort(k,j+1,t); //遞歸排序基準元素后面的子序列 } }
int main() { int k[10]={2,5,6,3,7,8,0,9,12,1},i; printf("The orginal data array is\n"); for(i=0;i<10;i++) printf("%d ",k[i]); quicksort(k,0,9); //從大到小排序 printf("\nThe result of quick sorting for the array is\n"); for(i=0;i<10;i++) printf("%d ",k[i]); return 0; }
//希爾排序算法思想:縮小增量gap->劃分序列->將每個子序列排序 #include<stdio.h> void shellsort(int k[],int n) { int i,j,flag,gap=n; int tmp; while(gap>1) { gap=gap/2; do{ flag=0; for(i=1;i<=n-gap;i++) { j=i+gap; if(k[i]<k[j]) { tmp=k[i]; k[i]=k[j]; k[j]=tmp; flag=1; } } }while(flag!=0); } }
int main() { int i,a[11]={-111,2,5,6,3,7,8,0,9,12,1}; printf("The orginal data array is\n"); for(i=1;i<=10;i++) printf("%d ",a[i]);
shellsort(a,10);
printf("\nThe result of Shell's sorting for the array is\n");//從大到小排序 for(i=1;i<=10;i++) printf("%d ",a[i]); return 0; }
#include<stdio.h> int insertsort(int a[],int n)//直接排序法 { int i,j; for(i=2;i<=n;i++) { a[0]=a[i]; //a[0]作為臨時變量存儲a[i] j=i-1; while(j>0 && a[0]>a[j])//從大到小排列 a[j+1]=a[j--]; a[j+1]=a[0]; //將元素a[0]插入指定位置 } return 0; }
int main() { int i,a[11]={-111,2,5,6,3,7,8,0,9,12,1};//a[0]沒有使用 printf("The orginal data array is\n"); for(i=1;i<=10;i++) printf("%d ",a[i]); insertsort(a,10); printf("\nThe result of insertion sorting for the array is\n"); for(i=1;i<=10;i++) printf("%d ",a[i]); printf("\n"); return 0; }
#include<stdio.h> //用先序序列創建一棵二叉樹,并輸出字符D位于二叉樹的層數 #include<stdlib.h> #include<conio.h> typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;
CreatBiTree(BiTree *T) { char c; scanf("%c",&c); if(c == ' ') *T=NULL; //如果輸出的是空格,則表示創建的子樹結束 else { *T=(BiTNode*)malloc(sizeof(BiTNode)); //創建根結點 (*T)->data=c; //向根結點中輸入數據 CreatBiTree(&((*T)->lchild)); //遞歸地創建左子樹 CreatBiTree(&((*T)->rchild)); //遞歸地創建右子樹 } } //訪問二叉樹結點,輸出包含D字符結點位于二叉樹中的層數 visit(char c,int level) { if(c=='D') printf("%c is at %d lever of BiTree\n",c,level); } PreOrderTraverse(BiTree T,int level) { if(T) //遞歸結束條件,T為空 { visit(T->data,level);//訪問根結點 PreOrderTraverse(T->lchild,level+1); PreOrderTraverse(T->rchild,level+1); } }
int main() { int level=1; BiTree T=NULL; //最開始T指向空 CreatBiTree(&T); PreOrderTraverse(T,level); getche(); return 0; }
//隊列的基本操作:實現一個鏈隊列,任意輸入一串字符,以@為結束標志,然后將隊列中的元素逐一取出,打印在屏幕上 #include<stdio.h> #include<stdlib.h> #include<conio.h> typedef char ElemType; typedef struct QNode { ElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct{ QueuePtr front; //隊頭指針 QueuePtr rear; //隊尾指針 }LinkQueue;
initQueue(LinkQueue *q) //創建一個頭結點,隊頭隊尾指針指向該結點 { q->front=q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!q->front) exit(0); q->front->next=NULL; }
EnQueue(LinkQueue *q,ElemType e) { QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode)); if(!q->front) exit(0); p->data=e; //數據e入列 p->next=NULL; q->rear->next=p; q->rear=p; }
DeQueue(LinkQueue *q,ElemType *e)//如果隊列q不為空,刪除q的隊頭元素,用e返回其值 { QueuePtr p; if(q->front==q->rear) return; //隊列為空,返回 p=q->front->next; *e=p->data; q->front->next=p->next; if(q->rear==p) q->rear=q->front;//如果隊頭就是隊尾,則修改隊尾指針 free(p); }
int main() { ElemType e; LinkQueue q; initQueue(&q); printf("Please input a string into a queue\n"); scanf("%c",&e); while(e!='@') { EnQueue(&q,e); scanf("%c",&e); } printf("The string into the queue is\n"); while(q.front!=q.rear) { DeQueue(&q,&e); printf("%c",e); }
printf("\n"); getche(); return 0; }
//二進制轉換為十進制數(利用棧的數據結構) #include<stdio.h> #include<math.h> #include<stdlib.h> #include<conio.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10
typedef char ElemType; typedef struct{ ElemType *base; ElemType *top; int stacksize; }sqStack;
initStack(sqStack *s) //創建一個棧 { s->base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(!s->base) exit(0); s->top=s->base; s->stacksize=STACK_INIT_SIZE; } Push(sqStack *s,ElemType e){ if(s->top-s->base>=s->stacksize){ s->base=(ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)); if(!s->base) exit(0); s->top=s->base+s->stacksize; s->stacksize=s->stacksize+STACKINCREMENT; } *(s->top)=e; s->top++; }
Pop(sqStack *s,ElemType *e){ if(s->top==s->base) return; *e=*--(s->top); }
int StackLen(sqStack s){ //計算棧的當前容量 return (s.top-s.base); }
int main() { ElemType c; sqStack s; //棧 int len,i,sum=0; printf("Please input a Binary digit\n");
initStack(&s); //輸入0/1字符表示的二進制數,以#結束
scanf("%c",&c); while(c!='#') { Push(&s,c); scanf("%c",&c); } getchar(); len=StackLen(s);
for(i=0;i<len;i++) { Pop(&s,&c); sum=sum+(c-48)*pow(2,i);//c-48是為了得到該字符對應的0/1值,這是因為字符0的ASCII碼為48 } printf("Decimal is %d\n",sum); getche(); return 0; }
//清空一個棧 代碼 ClearStack(sqStack *s) { s->top=s->base; }
//銷毀一個棧 代碼
DestroyStack(sqStack *s) { int i,len; len=s->stacksize; for(i=0;i<len;i++) { free(s->base); s->base++; } s->base=s->top=NULL; s->stacksize=0; }
- 描述
Fibonacci數列:0,1,1,2,3,5,8,13,21,… 從0開始,后續的數具有這樣的性質:當前的數是其前面兩個數之和。編寫一個函數計算第n個Fibonacci數。規定:Fibonacci(1)=1,fibonacci(2)=1。 - 輸入
第一行1個整數t,表示有t組數據。以下t行,每行一個整數n。 - 輸出
共t行,對于每個n,輸出第n個Fibonacci數(結果不超過long int的范圍)。 - 樣例輸入
2 3 5 - 樣例輸出
2 5
int main() { int t,i=0; int a[10]; scanf("%d",&t); while(t--) { int pre=1,next=1,result=1; scanf("%d",&a[i]); while(a[i]>2) { a[i]--; next=pre; pre=result; result=pre+next; } printf("%d\n",result); i++; } return 0; }
- 描述
“回文”是一種特殊的數或者文字短語。他們無論是順讀還是倒讀,結果都一樣。例如:12321, 55555,45554。讀入一個5位整數,判斷它是否是回文數。 - 輸入
多組測試數據,每組一行,一個五位整數,數據以0結尾。 - 輸出
對每組輸入數據輸出一行,如果輸入數是回文數,輸出“Yes.” ,否則輸出 “No.” 。 - 樣例輸入
12345 12321 11111 0 - 樣例輸出
No. Yes. Yes.
源代碼如下,注意循環長度為(length/2+1)。 #include<stdio.h> #include<string.h> #include <stdlib.h> int main() { int n,length,i=0,c; char str[6]; while(scanf("%d",&n)!=EOF) { if(n==0) exit(1); c=0; sprintf(str,"%d",n); length=strlen(str); for(i=0;i<(length/2+1);i++) { if(str[i]==str[length-i-1]) c++; else break; } if(c==3) printf("Yes.\n"); else printf("No.\n"); } return 0; }
要求:從終端輸入一組整數(大于10),以0作為結束標志,將這一組整數存放在一個鏈表中(結束標志0不包括在內),打印出該鏈表中的值。然后刪除該鏈表的第5個元素,打印出刪除后的結果。最后在內存中釋放掉該鏈表。 源程序如下: #include<stdio.h> #include<stdlib.h> #include<conio.h> typedef int ElemType; typedef struct node{ ElemType data; struct node *next; }LNode,*LinkList;
LinkList GreatLinkList(int n){ LinkList p,r,list=NULL; ElemType e; int i; for(i=1;i<=n;i++) { scanf("%d",&e); p=(LinkList)malloc(sizeof(LNode)); p->data=e; p->next=NULL; if(!list) list=p; //如果list為空,則說明本次生成的結點為第一個結點,將p賦給list else r->next=p;//否則將p賦給r->next,這里r永遠指向原先鏈表的最后一個結點,也就是要插入結點的前一個結點 r=p; } return list;//返回鏈表頭指針 }
void insertList(LinkList *list,LinkList q,ElemType e) { LinkList p; p=(LinkList)malloc(sizeof(LNode)); p->data=e; if(!*list){ //當鏈表為空時,將p賦給list,p的next域的值置為空 *list=p; p->next=NULL; } else { p->next=q->next;//q為插入指針指向的結點 q->next=p; } }
void delLink(LinkList *list,LinkList q){ LinkList r; if(q==*list)//如果刪除第一個結點 { *list=q->next; free(q); } else //刪除其他結點 { for(r=*list;r->next!=q;r=r->next);//當q所指向的結點的前驅結點的指針未知時,需要先通過鏈表頭指針list遍歷鏈表, //找到q的前驅結點的指針,并把該指針賦值給指針變量r if(r->next!=NULL){ r->next=q->next; free(q); } } }
void destroyLinkList(LinkList *list){ LinkList p,q; p=*list; while(p)//循環釋放掉每個鏈表結點 { q=p->next; free(p); p=q; } *list=NULL;//將該鏈表完全置空,防止list變成野指針 }
void main() { int e,i; LinkList l,q; q=l=GreatLinkList(1);//創建鏈表一個結點,q和l指向該結點 scanf("%d",&e); while(e) //循環輸入數據,同時插入新生成的結點 { insertList(&l,q,e); q=q->next; scanf("%d",&e); } q=l; printf("The content of the linklist\n"); while(q) //輸出鏈表中的內容 { printf("%d ",q->data); q=q->next; } q=l; printf("\nDelete teh fifthe element\n"); for(i=0;i<4;i++) { q=q->next; }//將指針q指向鏈表的第5個元素
delLink(&l,q); q=l; while(q) { printf("%d ",q->data); q=q->next; } destroyLinkList(&l); getche();//輸入后立即從控制臺取字符,不以回車為結束(帶回顯) }
要求:順序表初始長度為10,向順序表中輸入15個整數,并打印出來;再刪除順序表中的第5個元素,打印出刪除后的結果。 #include<stdio.h> #include<conio.h> #include<stdlib.h> #define MaxSize 10 typedef int ElemType; typedef struct{ int *elem; int length; int listsize; } Sqlist; //初始化一個順序表 void initSqlist(Sqlist *L) { L->elem=(int*)malloc(MaxSize*sizeof(ElemType)); if(!L->elem) exit(0); L->length=0; L->listsize=MaxSize; }
void InsertElem(Sqlist *L,int i,ElemType item){ ElemType *base,*insertPtr,*p; if(i<1||i>L->length+1)exit(0); if(L->length>=L->listsize) { base=(ElemType*)realloc(L->elem,(L->listsize+10)*sizeof(ElemType)); L->elem=base; L->listsize=L->listsize+100; } insertPtr=&(L->elem[i-1]); for(p=&(L->elem[L->length-1]);p>=insertPtr;p--) *(p+1)=*p; *insertPtr=item; L->length++; }
void DelElem(Sqlist *L,int i) { ElemType *delItem,*q; if(i<1||i>L->length) exit(0); delItem=&(L->elem[i-1]); q=L->elem+L->length-1; for(++delItem;delItem<=q;++delItem)*(delItem-1)=*delItem; L->length--; }
void main() { Sqlist l; int i; initSqlist(&l); for(i=0;i<15;i++) InsertElem(&l,i+1,i+1); printf("\nThe content of the list is\n"); for(i=0;i<l.length;i++) printf("%d",l.elem[i]); DelElem(&l,5); printf("\nDelete the fifth element\n"); for(i=0;i<l.length;i++) printf("%d",l.elem[i]); getche(); }
|