C和指针之学习笔记(5)

第10章 使用结构和指针

  1. 单链表

typedef struct NODE {

struct NODE *link;

int value;

} Node;

插入到一个有序单链表:

#include<stdio.h>

#include<stdlib.h>

#include "sll_node.h"

#define FALSE 0

#define TRUE 1

int sll_insert( Node **linkp, int new_value)  //指针的指针

{

Node *current;

Node *new;

//寻找正确的插入位置,方法是按序访问链表,直到到达一个

//其值大于或等于新值的节点

while((current= *linkp)!=NULL && current->value<new_value)

linkp=¤t->link;

new=(Node *)malloc(sizeof( Node ));

if( new == NULL )

return FALSE;

new->value = new_value;

//在链表中插入新节点,并返回TRUE

new->link = current;

*linkp = new;

return TRUE;

}

2.双链表

typedef struct NODE {

struct NODE *fwd;  //指向后一个节点

struct NODE *bwd;  //指向前一个节点

int value;

} Node ;

在双链表插入节点

#include<stdio.h>

#include<stdlib.h>

#include "doubly_liked_list_node.h"

int dll_insert( Node *rootp, int value)

{

Node *this;     //指向应该在新节点之前的那个节点

Node *next;     //指向应该在新节点之后的那个节点

Node *newnode;

for ( this = rootp; (next = this->fwd)!=NULL; this = next)

{

if ( next->value == value)

return 0;

if( next->value > value)

break;

}

newnode = (Node *)malloc(sizeof( Node));

if ( newnode == NULL )

return -1;

newnode->value = value;

//把新节点添加到链表中

newnode->fwd = next;

this->fwd=newnode;

if( this != rootp )

newnode->bwd = this;

else

newnode->bwd = NULL;

if( next != NULL )

next->bwd = newnode;

else

rootp->bwd = newnode;

return 1;

}

}

第15章 输入/输出函数

1、fseek()和ftell()的用法

int  fseek( FILE  *stream, long  offset, int  from);

int  ftell( FILE  *stream);

  ftell 函数返回流的当前位置

  fseek 函数改变下一个读取写入操作的位置。第一个参数:一个指向被搜索文件的FILE指针。第二个参数:偏移量,表示从起始要移动的距离,可以为正(前移)、负(后移)、零(保持不动)。第三个参数:模式,用来标识起始点(SEEK_SET:文件开始; SEEK_CUR:当前位置; SEEK_END:文件结尾)

fseek( fp, l0L , SEEK_SET )  //找到文件的第10个字节

#include<stdio.h>

#include<stdlib.h>

#define CNTL_Z ‘\032‘

#define SLEN 50

int main()

{

char file[SLEN];

char ch;

FILE *fp;

long count ,last;

puts("Enter the name of the file to be processed:");

gets(file);

if((fp = fopen(file,"rb"))==NULL)

{

printf("reverse can‘t open %s \n",file);

exit(1);

}

fseek(fp,0L,SEEK_END); //定位到文件结尾处

last=ftell(fp);

for(count=1L;count<=last;count++)

{

fseek(fp,-count,SEEK_END);

ch=getc(fp);

if(ch!=CNTL_Z && ch!=‘\r‘)

putchar(ch);

}

putchar(‘\n‘);

fclose(fp);

return 0;

}

运行结果:

时间: 2024-10-05 03:40:28

C和指针之学习笔记(5)的相关文章

【C++】--关于指针的学习笔记

1.指针的定义 指针(pointer)是指向另外一种类型的复合类型,与引用类似,指针也实现了对其他对象的间接访问. 与引用不同的几点: 1.指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象. 2.指针不一定要在定义时赋初值. note:在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值. 3. ...(待之后的学习实践中补充) 2.定义指针类型的方法 定义指针类型的方法是在变量名前面添加[*]星号,即将声明符写成[*d]的形式,d是变量名

《C和指针》学习笔记(1)

最近C语言已经学完,布置的大作业:学生管理系统5个版本也完成了.但是又买了一本<C和指针>,主要是感觉自己的指针还是没有完全熟悉.所以还是要好好研究一下.闲话不多说,直接第一章.一看是快速入门,以为很简单,但那个程序就把我卡了半天才看懂,按照作者说的的确运用了C语言中的大部分技巧. 程序1.1:首先读取一串列标号,这些列标号成对出现,便是输入行的列范围.这串列标号以一个负值结尾,作为结束标志.剩余的输入行被程序读入并打印,然后输入行中被选中范围的字符串被提取出来打印. 书中代码如下: #inc

智能指针_auto_ptr2_学习笔记

//1,release函数只是简单的转移对内存的拥有权,自己变成null,不会delete,一般在将所有权转移给别的智能指针的时候使用.具体可参加源码. 例: #include <memory> #include <iostream> using namespace std; class A { public:  A(int a):m_na(a)  {      cout<<"A cont" <<endl;  }  virtual ~A(

《C和指针》学习笔记(4)

进入<pointer on C>的第二章,不过感觉这一章没讲什么实质性的内容,主要是一些风格.字符以及一些古老的东西(比如三字母词)自己也不是很感兴趣.不过也算是了解一下C的历史了吧.不过问题和程序还是好好看了看. 比如又知道了一些转义字符: \?在书写多个分号的情况下使用,防止被解释为三字母词. \”用于表示一个字符串常量内部的双引号. \’用于表示字符常量. \\用于表示一个\ 写了一个例子: #include <stdio.h> #include <stdlib.h&g

《C和指针》学习笔记(2)

1.1  "hello world"程序不说了,codeblocks直接生成. 1.2   题目:从标准输入读取几行输入.每行输入都要打印到标准输出上,前面要加上行号.让程序能够处理的输入行没有长度限制. /*我的程序*//* int main() { int ch; int line=1; while((ch=getchar())!=EOF) { printf("%d",line); if(ch!='\n') printf("%c",ch);

C和指针之学习笔记(3)

第8章 数组 1.数组与指针 数组名是一个指针常量,也就是数组第1个元素的地址. int  a[10];  int  b[10];  int  *c; (1) c = & a[0]; &a[0]表示一个指向数组第1个元素的指针. (2) c=a; 与 c = & a[0]; 等价 (3) b = a; 非法,不能使用赋值符把一个数组的所有元素复制到另一个数组,必须使用一个循环,每次复制一个元素. (4) a = c; 非法,a是指针常量,而c是指针变量. 2. 下标引用和间接访问完

《深入理解C指针》学习笔记(1)--- 指针之外

C语言从诞生之初就非常善于和硬件打交道,经过这么多年的发展之后,其灵活性和超强的特征是受到几乎所有程序员的肯定.C语言的这种灵活性很大一部分程度来源与C指针,指针为C语言动态操控内存提供了支持,同时也便于访问硬件.由于编程的本质就是操控数据,而数据大多都在内存中,理解C管理内存的工作原理,就显得尤为重要了.知道malloc()函数能够从堆上申请内存,理解内存分配的本质则是另外的事. 请看代码例子: 1 #include <stdio.h> 2 #include <stdlib.h>

C和指针之学习笔记(6)

第17章 经典数据结构类型 堆栈 堆栈接口提供三种基本的操作:push.pop 和 top. Push:把一个新值压入到堆栈的顶部. Pop: 只把顶部元素从堆栈中移除,它并不返回这个值. Top: 返回顶部元素的值,但它并不把顶部元素从堆栈中移除.   (1)堆栈接口 #ifndef STACK_H #define STACK_H #include<stdlib.h> #define STACK_TYPE int //push 把一个新值压入到堆栈中,它的参数是需要被压入的值 void pu

C和指针之学习笔记(4)

第9章 字符串 字符串的输入与输出 int  ch;  char strings[80];  FILE *input; (1)scanf(“%c”,&ch);   printf(“%c \n”,ch);    (输入字符串时自动添加’\0’) (2)ch = getchar();   putchar(ch); (3)gets( strings );    puts( strings );      (输入字符串时自动添加’\0’) (4)fgets( strings, 80, stdin);