题目:编写UNIX程序sort的简化版本,该程序按字母顺序对由文本行组成的集合进行排序。

  思路:我们引入指针数组处理这种问题。如果待排序的文本行首尾相连地存储在一个长字符数组中,那么每个文本行可通过指向它的第一个字符的指针来访问。这些指针本身可以存储在一个数组中。这样,将指向两个文本行的指针传递给函数strcmp就可实现对这两个文本行的比较。当交换次序颠倒的两个文本行时,实际交换的是指针数组中与这两个文本行相对应的指针,而不是这两个文本行本身,如下图所示。

  这种实现方法消除了因移动文本行本身所带来的复杂的存储管理和巨大的开销这两个孪生问题。

  排序过程包括下列3个步骤:

  • 读取所有输入行
  • 对文本行进行排序
  • 按次序打印文本行

  代码实现:

#include <stdio.h>
#include <string.h> #define MAXLINES 5000 // 定义最大的输入行数
#define MAXLEN 1000 // 每行字符最大长度
#define ALLOCSIZE 10000 // 分配的最大存储空间
char allocbuf[ALLOCSIZE];
char *allocp = allocbuf;
char *lineptr[MAXLINES]; // 指针数组,其中每个元素存放的是一行 /* 读取一行输入 */
int getline(char s[], int lim)
{
int c, i; for (i = ; i < lim - && (c = getchar()) != EOF && c != '\n'; i++){
s[i] = c;
}
if (c == '\n') {
s[i++] = c;
}
s[i] = '\0';
return i;
} // 分配存储空间
char *alloc(int n){
if(allocbuf + ALLOCSIZE -allocp >= n){
allocp += n;
return allocp-n;
}else{
return ;
}
} /* 读取所有行输入,并存入指针数组中 */
int readlines(char *lineptr[], int maxlines){
int len, nlines;
char *p, line[MAXLEN];
nlines = ;
// 循环读取每一行
while((len = getline(line, MAXLEN)) > ){
// 分配存储空间
if(nlines >= MAXLINES || (p = alloc(len)) == NULL){
return -;
}else{
line[len - ] = '\0';
strcpy(p, line);
lineptr[nlines++] = p;
}
}
return nlines;
} /* 打印输出 */
void writelines(char *lineptr[], int nlines){
int i;
for(i = ; i < nlines; i++){
printf("%s\n", lineptr[i]);
}
} /* 数据交换 */
void swap1(char *v[], int i, int j){
char *tmp;
tmp = v[i];
v[i] = v[j];
v[j] = tmp;
} /* 快速排序(这里取分割点为集合的中点) */
void qsort1(char *v[], int left, int right){
int i, last;
if(left >= right){
return;
}
swap1(v, left, (left+right)/);
last = left;
for(i = left+; i<=right; i++){
if(strcmp(v[i], v[left]) < ){
swap1(v, ++last, i);
}
}
swap1(v, left, last);
qsort1(v, left, last-);
qsort1(v, last+, right);
} /* 主函数 */
main(){
int nlines; //输入的行数
if((nlines = readlines(lineptr, MAXLINES)) >= ){
qsort1(lineptr, , nlines-);
writelines(lineptr, nlines);
return ;
}else{
printf("error: input too big to sort\n");
return ;
}
}

【C语言】指针数组的更多相关文章

  1. c语言指针数组与数组指针

    一.指针数组和数组指针的内存布局初学者总是分不出指针数组与数组指针的区别.其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是“储存指针的数组”的简称.数 ...

  2. 【嵌入式开发】C语言 指针数组 多维数组

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...

  3. C语言指针数组(每个元素都是指针)

    转载:http://c.biancheng.net/cpp/html/3246.html 注意:数组指针的区别 如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组.指针数组的定义形式一般 ...

  4. C语言 指针数组 多维数组

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...

  5. c语言 指针数组

    指针数组指针数组是数组,指针数组每个元素是一个指针指针数组的定义:type* parray[n]; type* 是数组中每个元素的类型parray 为数组名n为大小 例子:float* a[3] // ...

  6. C语言 指针数组指针

    指向指针数组的指针. 1 #include <stdio.h> 2 3 int main(void) 4 { 5 char *pa[4]={"aaaaa"," ...

  7. c语言指针数组和结构体的指针

    指向数组的指针,先初始化一个数组,使用传统方式遍历 void main() { ] = { ,,,, }; ; i < ; i++) { printf("%d,%x\n", ...

  8. C语言--指针数组大小

    #include <stdio.h> #include <string.h> int main(void) { char *str[3]={ "Hello,thisi ...

  9. C语言指针【转】

    一.C语言指针的概念 在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细 ...

  10. C语言入门---第九章 C语言指针

    没学指针就是没学C语言! 指针是C语言的精华,也是C语言的难点. 所谓指针,也就是内存的地址,所谓指针变量,也就是保存了内存地址的变量.不过人们往往不会区分两者的概念,而是混淆在一起使用. ===== ...

随机推荐

  1. 面试题04_替换空格_剑指Offer系列

    题目描写叙述 请实现一个函数,将一个字符串中的空格替换成"%20". 比如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 解题思路 ...

  2. C#.NET常见问题(FAQ)-如何让控件或者窗体本身全屏

    初始化的时候保存控件的原始尺寸,然后通过Dock属性调节   注意如果你的控件是放在容器中的,那么对应设置的也要是容器的Dock属性   全屏的效果如下图所示   更多教学视频和资料下载,欢迎关注以下 ...

  3. jquery 和 FormData 最简单图片异步上传

    <script src="/scripts/jquery/jquery-3.1.1.min.js"></script> <script type=&q ...

  4. js检测来源网址,如果是搜索引擎跳转到新地址

    [js]代码 <script> var regexp=/\.(sogou|soso|baidu|google|youdao|yahoo|bing|118114|biso|gougou|if ...

  5. Apache Rewrite规则详解

    参考链接:http://slj.me/2009/04/apache-rewrite-regular/ 1.Rewrite规则简介 Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Pe ...

  6. 使用Chrome保存网页为mht文件

    一直在使用chrome浏览器,但由于需要将部分网页保存为mht文件,却发现chrome默认不支持.chrome浏览器默认支持2种:单独的html文件,全部: 万能的chrome怎么可能保存不了mht? ...

  7. ANT简明教程[转载]

    一.ant关键元素 1. project元素 project 元素是 Ant 构件文件的根元素, Ant 构件文件至少应该包含一个 project 元素,否则会发生错误.在每个 project 元素下 ...

  8. Centos7中安装Python3

    环境:CentOS 7 1. 安装依赖环境 # yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-dev ...

  9. Unbuntu和Centos中部署同时多版本PHP的详细过程

        镜像制作:Unbuntu14 部署LAMP过程 1.Azure经典版中创建源Ubuntu14,并使用Xshell连接,并切换到root帐户下. 2.安装php5.4,新建/var/local/ ...

  10. JSjs获取当前时间的前一天/后一天(昨天/明天)

    Date curDate = new Date(); var preDate = new Date(curDate.getTime() - 24*60*60*1000); //前一天 var next ...