【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语言的难点. 所谓指针,也就是内存的地址,所谓指针变量,也就是保存了内存地址的变量.不过人们往往不会区分两者的概念,而是混淆在一起使用. ===== ...
随机推荐
- GPUImage API 文档之GPUImageFilter类
GPUImageFilter类 方法 - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShade ...
- Ado.Net,关于DataSet和DataTable
DataSet和DataTable的 区别与联系 1.简要说明二者关系 在我们编写代码的时候从数据库里取出数据,填充到dataset里,再根据表的名字,实例化到 DataTable 中. ●注意如下 ...
- Web安全 之 X-Frame-Options响应头配置
最近项目处于测试阶段,在安全报告中存在" X-Frame-Options 响应头缺失 "问题,显示可能会造成跨帧脚本编制攻击,如下图: X-Frame-Options: 值有三个: ...
- 关于testNG和JUnit的对比
关于选择JUnit还是选testNG,这几篇文章,建议读一读: API参考文档: Junit API文档:http://junit.org/junit4/javadoc/latest/index.ht ...
- C++ 第九课 标准c数学函数
abs() 求绝对值 acos() 求反余弦 asin() 求反正弦 atan() 求反正切 atan2() 求反正切,按符号判定象限 ceil() 求不小于某值的最小整数 (求上界) cos() 求 ...
- POSTGRESQL 支持正则表达式
昨天遇到了一个奇葩的问题,需要在WHERE条件里面添加正则表达式,抱着试试看的态度,查看了一下postgresql,发现确实可以支持正则,例如: select * from user where em ...
- sqlmap检测sql注入漏洞
sqlmap是一款非常强大的开源sql自动化注入工具,可以用来检测和利用sql注入漏洞.它由python语言开发而成,因此运行需要安装python环境. 官网:http://sqlmap.org/ 乌 ...
- 【Python】文件读写操作
Python的文件读写有点类似php的文件读写.php的文件读写已经在<[php]让记事本成为你调控变量的控制台>(点击打开链接)说过了,以下用一个小样例说明Python的文件读写. 在F ...
- (转)C#中Invoke的用法 一
在用.NET Framework框架的WinForm构建GUI程序界面时,如果要在控件的事件响应函数中改变控件的状态,例如:某个按钮上的文本原先叫“打开”,单击之后按钮上的文本显示“关闭”,初学者往往 ...
- 让服务器可以下载apk和ipa文件
选中指定网站→在右侧找到 MIME类型 → 双击进入已有类型页 → 点击最右侧添加 apk application/vnd.android.package-archive MRP文件(国内普遍的 ...