對終端輸入的行內容進行字典排序並把結果輸出出來
阿新 • • 發佈:2019-02-01
執行結果:/*********************************************************************** Copyright (c) 2015,wangzp All rights no reserved. Name: Sort the input lines from terminal ID: The C Programming Language 問題簡述: 對輸入的文字行按照字母在字典中的順序進行排序。 Date: Sep 23, 2015 ***********************************************************************/ #include #include #include #define MAXLINES 5000 /*能夠儲存的最大文字行數*/ #define MAXLEN 1000/*每行文字行的長度*/ char *lineptr[MAXLINES];/*指向文字行的指標*/ int readlines(char *lineptr[],int nlines);/*讀文字行函式*/ void writelines(char *lineptr[],int nlines);/*寫入文字行函式*/ void qsort(char *v[],int left,int right);/*文字行排序函式*/ int getline(char *s,int lim); void swap(char *v[],int i,int j); /*主函式*/ int main(void) { int nlines;/*輸入行數目*/ if ((nlines = readlines(lineptr,MAXLINES)) >= 0) { qsort(lineptr,0,nlines - 1); writelines(lineptr,nlines); /*檢視記憶體釋放情況*/ printf("free記憶體塊之前:\n"); for (int i = 0;i < nlines;i++) { printf("%s\n",lineptr[i]); } printf("free記憶體塊之後:\n"); for (int i = 0;i < nlines;i++) { free(lineptr[i]); printf("%s\n",lineptr[i]); } printf("處理野指標之後:\n"); for (int i = 0;i < nlines;i++) { lineptr[i] = NULL; printf("%s\n",lineptr[i]); } return 0; } else { printf("error:input too big to sort.\n"); return 1; } } /*********************************************************************** @author : wzp @Name : getline @Funcation: 將一行讀入s[]中並返回其長度 @Date : Sep 23, 2015 ***********************************************************************/ int getline(char s[],int lim) { int c,i; for (i = 0;i < (lim -1) && (c = getchar()) != EOF && c != '\n';i++) { s[i] = c; } /*儲存行末尾的回車*/ if (c == '\n') { s[i] = c; i++; } s[i] = '\0';/*行結束*/ return i; } /*********************************************************************** @author : wzp @Name : readlines @Funcation: 讀入行 @Date : Sep 23, 2015 ***********************************************************************/ int readlines(char *lineptr[],int maxlines) { int len,nlines; char *p,line[MAXLINES]; nlines = 0; while ((len = getline(line,MAXLEN)) > 0) { if (nlines >= maxlines || (p = (char *)malloc(len)) == NULL) { return -1; } else { line[len -1] = '\0';//刪除每一行的回車 strcpy(p,line);//把終端輸入的行內容拷貝到p指標指向的空間中 lineptr[nlines++] = p;//儲存當前行的指標,排序時只需要變化指標即可,不需要動行的內容 } } return nlines;//返回讀取了多少行 } /*********************************************************************** @author : wzp @Name : writelines @Funcation: 寫輸出行,即列印行 @Date : Sep 23, 2015 ***********************************************************************/ void writelines(char *lineptr[],int nlines) { int i; for (i = 0;i < nlines;i++) { printf("%s\n",lineptr[i]); } } /*********************************************************************** @author : wzp @Name : qsort @Funcation: 按照字典順序對行進行增序排序 快速排序方法 @Date : Sep 23, 2015 ***********************************************************************/ void qsort(char *v[],int left,int right) { int i,last; if (left >= right)//遞迴結束條件 { return; } swap(v,left,(left + right)/2); last = left; for (i = left + 1;i <= right;i++) { if (strcmp(v[i],v[left]) < 0) { swap(v,++last,i); } } swap(v,left,last);//恢復分割槽元素後遞迴呼叫排序演算法 qsort(v,left,last); qsort(v,last + 1,right); } /*********************************************************************** @author : wzp @Name : swap @Funcation: 交換兩個指標陣列中的內容,注意交換的元素為指標 @Date : Sep 23, 2015 ***********************************************************************/ void swap(char *v[],int i,int j) { char *temp; temp = v[i]; v[i] = v[j]; v[j] = temp; }