写一个链表的小案例,体会一下链表的存储特色,和数组的区别,以及指针的运用方法。
数组
/* 链表结构 流程: 建立结构体 一、建立头指针,用于保存头结点的指针 二、建立头结点,保存首节点指针 三、动态建立链表 四、输出 */ # include <stdio.h> # include <malloc.h> # include <stdlib.h> struct Node { int data; struct Node * pNode; }; //函数声明(居然忘了(ToT)/~~~) struct Node * create_list(void); void traverse_list(struct Node *); int main(void) { struct Node * pHead = NULL; //定义一个头指针(NULL必须大写) pHead = create_list(); //建立一个链表,把头结点的指针传递给头指针元素保存 printf("\n\n"); traverse_list(pHead); //输出整个链表 return 0; } struct Node * create_list(void) { int len; int i; int val; //建立一个头结点 struct Node * pHead = (struct Node *)malloc(sizeof(struct Node)); if( NULL == pHead ) { printf("头结点建立失败\n"); exit(-1); } pHead -> pNode = NULL; /* 为了解决在下面for循环中,每次都会把指针交给头结点保存这个问题, 须要另外建立一个指针变量 */ struct Node * pTail = pHead; printf("请输入链表的个数:"); scanf("%d",&len); printf("\n"); for(i = 0; i < len; i++) { printf("请输入第%d个元素:",i+1); scanf("%d",&val); struct Node * pNew = (struct Node *)malloc(sizeof(struct Node)); pNew -> data = val; pNew -> pNode = NULL; /* 第一次写到这里的时候,写的是 pHead -> pNode = pNew; 第一次循环的时候是正确的,把首结点的指针保存到了头结点 第二次的时候就不对了,由于仍是会把第二个元素的指针保存到头结点中…… 因此,须要建立另一个,用以存放上一个元素的地址 */ pTail -> pNode = pNew; /* 将新建立的元素的地址交给pTail保存,用于存放下一个新建立的地址。 */ pTail = pNew; } //将头结点的地址返回 return pHead; } void traverse_list(struct Node * pHead) { struct Node * p = pHead -> pNode; printf("输出全部链表元素:"); while( NULL != p) { printf("%d ", p -> data); p = p -> pNode; //写到这里我好像理解了“头结点的目的是为了方便对链表的操做”这句话的含义 } printf("\n"); } /* VC++6.0 输出的结果是: ==================================== 请输入链表的个数:3 请输入第1个元素:1 请输入第2个元素:2 请输入第3个元素:3 输出全部链表元素:1 2 3 ==================================== 遇到的错误: 1,NULL必需要大写 (╯▽╰) 2,忘了写函数的前置声明 */
学PHP的小蚂蚁 博客 http://my.oschina.net/woshixiaomayi/blog函数