题目:编写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. 例子:使用Grunt创建一个Node.js类库

      创建一个文件夹. 打开命令行或者powershell, 运行npm init,根据提示填入package的信息. 在文件夹中创建index.js文件. /*! * mymongolib * Cop ...

  2. 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)

    怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...

  3. css调整图片位置布局

    <?xml version="1.0" encoding="utf-8"?><!DOCTYPE wml PUBLIC "-//WAP ...

  4. HDS Truecopy实现原理及项目的选择-诸多案例

    copy from:http://www.eygle.com/archives/2009/05/hds_truecopy_dataguard.html 诸多案例:http://wenku.baidu. ...

  5. 两个自定义对象List列表取交集(intersection)

    public static void main(String[] args) { List<Fpxx> list = ListUtils.intersection(getFpList1() ...

  6. Windows下安装Oracle Database 12c Release 1(12.1.0.2.0) - Enterprise Edition

    Windows下安装Oracle Database 12c Release 1(12.1.0.2.0) 最近因需要在Oracle 数据库上建立ODI的资料档案库,需要安装Oracle Database ...

  7. 【Linux】eclipse juno 边框过大的调整方法

    切换至eclipse目录: vi plugins/org.eclipse.platform_4.2.*/css/e4_default_gtk.css 找到.MPartStack,替换成如下代码: .M ...

  8. 给本地服务器配置py文件的下载功能

    打开以下网址 http://localhost/Myservers/test/weibo.py //本地服务器,下载Myservers目录下的test目录中的weibo.py文件 错误提示: HTTP ...

  9. vmware中的 CentOS7 虚机磁盘动态扩容

    0.在vmware的配置项中,将虚机的磁盘大小调大,步骤简单,此处略 查看当前状态 文件系统状态 df -h 磁盘状态 lsblkfdisk   -l  1.首先要再创建一个物理分区 (使用fdisk ...

  10. IM系统架构设计之浅见

    转自:http://mobile.51cto.com/hot-439693.htm 背景:除去大名鼎鼎的QQ这款即时聊天工具,还有许多细分行业的IM,比如淘宝阿里旺旺.网易泡泡.YY语音....... ...