【C语言】指针数组
题目:编写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语言】指针数组的更多相关文章
- c语言指针数组与数组指针
一.指针数组和数组指针的内存布局初学者总是分不出指针数组与数组指针的区别.其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是“储存指针的数组”的简称.数 ...
- 【嵌入式开发】C语言 指针数组 多维数组
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...
- C语言指针数组(每个元素都是指针)
转载:http://c.biancheng.net/cpp/html/3246.html 注意:数组指针的区别 如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组.指针数组的定义形式一般 ...
- C语言 指针数组 多维数组
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...
- c语言 指针数组
指针数组指针数组是数组,指针数组每个元素是一个指针指针数组的定义:type* parray[n]; type* 是数组中每个元素的类型parray 为数组名n为大小 例子:float* a[3] // ...
- C语言 指针数组指针
指向指针数组的指针. 1 #include <stdio.h> 2 3 int main(void) 4 { 5 char *pa[4]={"aaaaa"," ...
- c语言指针数组和结构体的指针
指向数组的指针,先初始化一个数组,使用传统方式遍历 void main() { ] = { ,,,, }; ; i < ; i++) { printf("%d,%x\n", ...
- C语言--指针数组大小
#include <stdio.h> #include <string.h> int main(void) { char *str[3]={ "Hello,thisi ...
- C语言指针【转】
一.C语言指针的概念 在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细 ...
- C语言入门---第九章 C语言指针
没学指针就是没学C语言! 指针是C语言的精华,也是C语言的难点. 所谓指针,也就是内存的地址,所谓指针变量,也就是保存了内存地址的变量.不过人们往往不会区分两者的概念,而是混淆在一起使用. ===== ...
随机推荐
- (转)Debug Assertion Failed! Expression: _pFirstBlock == pHead
最近在VS上开发C++程序时遇到了这个错误: Debug Assertion Failed! Expression:_pFirstBlock == pHead 如图: 点击Abort之后,查看调用 ...
- 配置 Windows 下的 nodejs C++ 模块编译环境 安装 node-gyp
配置 Windows 下的 nodejs C++ 模块编译环境 根据 node-gyp 指示的 Windows 编译环境说明, 简单一句话就是 "Python + VC++ 编译环境&quo ...
- ArcGIS10.6了解一下
因为计算机水平不断更新,ESRI不得不重新倾力打造下一代ArcMap,叫ArcGIS Pro,现在ArcGIS Pro功能有一定地突显,但还不够强大和稳定:而ArcGIS Desktop方面没有什么大 ...
- docker安装tomcat
先在官网上找可用的镜像 我使用的是7-jre8 获取tomcat镜像的命令:$docker pull tomcat:7-jre8 获取完镜像以后,通过命令可以列举出已有的镜像: 列举镜像的命令:$do ...
- 007-Go package 说明
1:在项目src下面存在两个目录,每个目录里面各有一个go文件 2:add.go package test02 func Add(a int, b int) int{ return a + b } 注 ...
- unity3d与web网页通信
总结一下: Unity3D 中的 C# 和 JavaScript 脚本之间是可以互相访问并交互的,但是要求这些被访问和操作的 C# 和 JavaScript 组件必须放在名为 Standard Ass ...
- loadrunner脚本001
Action() { ; lr_start_transaction("login"); web_add_cookie("JSESSIONID=061460B7DFF2F7 ...
- 用Power BI解读幸福星球指数
"你幸福吗?"已经成了网络热词,简单的问句背后蕴含着一个普通中国人对于所处时代的政治.经济.自然环境等方方面面的感受和体会.引发当代中国人对幸福的深入思考.实际上,国际上对幸福的讨 ...
- unity的 Social API
孙广东 2015.12.23 Social API Social API 是訪问的Unity 的point 社会功能.如:• 用户配置文件• 好友列表• 成就• 统计 / 排行榜 它提供了 ...
- linux mysql 数据库开启外部访问设置指南
Linux下设置MySQL和允许外部机器访问,具体目录是具体情况而定,有的人是安装了在个人目录下,则找到对应的目录则可以 Linux下设置MySQL和允许外部机器访问sudo vi /etc/my.c ...