1. 程式人生 > >對終端輸入的行內容進行字典排序並把結果輸出出來

對終端輸入的行內容進行字典排序並把結果輸出出來

/***********************************************************************
    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;
}


執行結果: