存档
标签为 ‘C’ 的文章

数据结构之链表

七月 20th, 2009 {3 条评论}

今晚在群里面说到了算法和数据结构,无聊之际,整理一下链表的资料,顺便也复习一下。。。

 

链表(Linked list)(台湾称为连结串列)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表:顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。

使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。

在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向明上一个/或下一个节点的位置的链接("links")。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任意位置上的节点,[1]但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。

链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表

 

&raquo 继续阅读;

MS08-067漏洞利用源代码

七月 17th, 2009 {3 条评论}

先看一下微软对这个漏洞的描述

MS08-067 – 严重

服务器服务中的漏洞可能允许远程执行代码 (958644)

发布日期: 十月 23, 2008

版本: 1.0

描述

&raquo 继续阅读;

有疑虑?那就建立一个接口吧!

五月 21st, 2009 {我抢 沙发}

现代的面向对象语言源自C++的特点之一是使用接口。一个接口是一个类,它没有具体的实现过程,只提供一个用来访问其资源的接口

 

  每个接口需要用一些具体的类来实现,但优点是,使得实现细节可以可容易地独立出来。因此,你不必同时担心实现和接口问题。

&raquo 继续阅读;

初学者必备:教你理解复杂的C/C++声明

三月 29th, 2009 {我抢 沙发}

曾经碰到过让你迷惑不解、类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明。我们将从每天都能碰到的较简单的声明入手,然后逐步加入const修饰符和typedef,还有函数指针,最后介绍一个能够让你准确地理解任何C/C++声明的“右左法则”。需要强调一下的是,复杂的C/C++声明并不是好的编程风格;这里仅仅是教你如何去理解这些声明。
让我们从一个非常简单的例子开始,如下: &raquo 继续阅读;

编程作业-打印菱形-C语言

四月 15th, 2008 {5 条评论}

 作业题目:打印出如下字符:
   *
  ***
*****
*******
*****
  ***
   *
C语言实现。 

 

代码如下
  1. #include <cstdlib>
  2. #include <iostream>
  3. using namespace std;
  4. int main(int argc, char *argv[])
  5. {
  6.         int i,j,k;
  7.         for(i=0;i<4;i++)
  8.         {
  9.                 for(j=0;j<=2-i;j++)
  10.                 {
  11.                         printf(" ");
  12.                 }
  13.      
  14.                 for(k=0;k<=2*i;k++)
  15.                 {
  16.                         printf("*");
  17.                 }
  18.                 printf("n");
  19.         }
  20.         for(i=0;i<3;i++)
  21.         {
  22.                 for(j=0;j<=i;j++)
  23.                 printf(" ");
  24.                  
  25.                 for(k=0;k<=4-2*i;k++)
  26.                 printf("*");
  27.                 printf("n");
  28.         }
  29.     system("PAUSE");
  30.     return EXIT_SUCCESS;
  31. }

 

这是经典的C语言作业,主要是行与行的星号之间的关系,可以从最长的进行分割,进行两次for循环。
这次是7*7的矩阵,所以刚开始打算用数组去实现,只需创建7*7的数组,然后填充即可,但是
这样写程序就死锁了,扩展性就已经失去了(如:我要用户输入个数,直接画,数组是不能的),而这个程序的扩展性也不佳,坐标系不一样了= =,稍后研究过后放出可扩展的程序代码

运行环境:
操作系统:Windows Vista Ultimate
编译器:Dev-C