題目:編寫unix程式sort的簡化版本,該程式按字母順序對由文字行組成的集合進行排序。
思路:我們引入指標陣列處理這種問題。如果待排序的文字行首尾相連地儲存在乙個長字元陣列中,那麼每個文字行可通過指向它的第乙個字元的指標來訪問。這些指標本身可以儲存在乙個陣列中。這樣,將指向兩個文字行的指標傳遞給函式strcmp就可實現對這兩個文字行的比較。當交換次序顛倒的兩個文字行時,實際交換的是指標陣列中與這兩個文字行相對應的指標,而不是這兩個文字行本身,如下圖所示。
這種實現方法消除了因移動文字行本身所帶來的複雜的儲存管理和巨大的開銷這兩個孿生問題。
排序過程包括下列3個步驟:
**實現:
#include #include#define maxlines 5000 //
定義最大的輸入行數
#define maxlen 1000 //
每行字元最大長度
#define allocsize 10000 //
分配的最大儲存空間
char
allocbuf[allocsize];
char *allocp =allocbuf;
char *lineptr[maxlines]; //
指標陣列,其中每個元素存放的是一行
/*讀取一行輸入
*/int getline(char s, int
lim)
if (c == '\n'
) s[i] = '\0'
;
returni;}
//分配儲存空間
char *alloc(int
n)else}/*
讀取所有行輸入,並存入指標陣列中
*/int readlines(char *lineptr, int
maxlines)
else
}return
nlines;}/*
列印輸出
*/void writelines(char *lineptr, int
nlines)}/*
資料交換
*/void swap1(char *v, int i, int
j)/*
快速排序(這裡取分割點為集合的中點)
*/void qsort1(char *v, int left, int
right)
swap1(v, left, (left+right)/2
); last =left;
for(i = left+1; i<=right; i++)
}swap1(v, left, last);
qsort1(v, left, last-1
); qsort1(v, last+1
, right);}/*
主函式
*/main()
else
}
C語言指標陣列和陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...
C語言指標陣列和陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...
C語言指標陣列和陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...