忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(9)链表
我们至少可以通过两种结构来存储数据
数组
1.需要一整块连续的存储空间,内存中可能没有
2.插入元素,删除元素效率极低。
3.查找数据快
链表
1.查找效率低
2.不需要一块连续的内存空间
3.插入删除元素效率高
计算机术语
头指针:存放头结点地址的指针变量
头结点:
数据类型和首节点的数据类型一模一样
头结点是首节点前面的那个节点
头结点并不存放有效数据
设置头结点的目的是为了方便对链表操作
首节点:存放第一个有效数据的节点
尾节点:
存放最后一个有效数据的节点
尾节点的指针域是空的(null)
头指针---->头结点---->(首节点----->链表------>尾节点) ()内是有效数据
只需要知道头指针就能确定一个链表(尾节点指针域是null)
2012年2月6日7:30:48 # include <stdio.h>
# include <malloc.h>
# include <stdlib.h> struct Node{
int data;
struct Node * pNext;
}; struct Node * create_list();
void traverseList(struct Node *); int main(void){
struct Node * pHead = NULL; //定义头指针
pHead = create_list(); //构造链表,返回头结点地址
traverseList(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);
}
struct Node * pTail = pHead; //将头结点的地址给指针变量pTail使pTail指向头结点
pTail->pNext = NULL; //头结点的结构体元素(下一个节点地址)赋值
printf("请输入你要创建链表的节点个数:len = ");
scanf("%d", &len); for(i=0; i<len; i++){
printf("请输入第%d个节点的值:", i+1);
scanf("%d", &val); //给第 i+1 个节点分配内存空间
struct Node * pNew = (struct Node *)malloc(sizeof(struct Node));
if(NULL == pNew){
printf("分配失败,程序终止!\n");
exit(-1);
}
//内存分配成功后
pNew->data = val; //新节点赋值
pTail->pNext = pNew; //pNew指向的地址给头结点的变量
pNew->pNext = NULL; //新节点地址变量给空值
pTail = pNew; //重新使pTai 替换 pNew进行下一次分配创建
}
return pHead;
} void traverseList(struct Node * pHead){
struct Node * p = pHead->pNext;
while(NULL != p){
printf("%d\n", p->data);
p = p->pNext;
}
return;
}
忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(9)链表的更多相关文章
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(2)准备知识
一.变量为什么必须初始化? 在回答这个问题之前,我们先来运行一段代码: #include <stdio.h> int main(){ int i; printf("i=%d\n& ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(5)有趣的指针
一.指针是C语言的灵魂 # include <stdio.h> int main(){ int *p; //p是变量名,int *表示p变量存放的是int类型变量的地址,p是一个指针变量 ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(3)输入输出函数
一.基本的输入和输出函数的用法 1.printf() //屏幕输出 用法: (1)printf("字符串\n"); (2)printf("输出控制符", 输出 ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(1)GCC介绍及C语言编译过程
一.GCC基本介绍 GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU开发的编程语言编译器.它是一套以GPL及LGPL许可证所发布的自由软件,也是GNU计划的关 ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(8)枚举、补码
一.枚举 # include <stdio.h> enum WeekDay //定义了一个数据类型(值只能写以下值) { MonDay, TuesDay, WednesDay, Thurs ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(7)结构体
一.为什么需要结构体? 为了表示一些复杂的事物,而普通类型无法满足实际需求 二.什么叫结构体? 把一些基本类型组合在一起形成的一个新的复合数据类型叫做结构体. 三.如何定义一个结构体? 第一种方式: ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(6)动态内存分配
一.传统数组的缺点: 1.数组的长度必须事先定制,且只能是常整数,不能是变量 int len = 5; int a[len]; //error 2.传统形式定义的数组,该程序的内存程序员无法手动释放 ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(4)for == while ?
一.for和while等价替换 int i = 1; for (i; i<=100; i++){ sum = sum + 1; } int i = 1; while(i<=100){ su ...
- 闲里偷忙的CPU-某个kwoker进程忙
https://zhuanlan.zhihu.com/p/34311472 有一类比较特殊的CPU使用率问题,这类问题的特点是,系统平均CPU使用率很低,但是个别CPU的使用率非常高.今天借助这个真实 ...
随机推荐
- 模板 Fail树
fail树就是将Trie图的Fail指针反指,从而生成一棵树,这个树的性质是:子节点对应字符串为以当前串为后缀,而子节点为原串的前缀,前缀的后缀就是嵌套在原串中的子串. 模板:BZOJ3172 Des ...
- Spring异步执行(@Async)2点注意事项
Spring中可以异步执行代码,注解方式是使用@Async注解. 原理.怎么使用,就不说了. 写2点自己遇到过的问题. 1.方法是公有的 // 通知归属人 @Async public void not ...
- ViewPager (下)-- 利用 Fragment 实现美丽的 页面切换
之前用的ViewPager适用于简单的广告切换,但实现页面间的切换最好是用官方推荐的Fragment来处理. 本人力争做到最简单.最有用,是想以后用到的时候能够方便的拿过来复制就能够了. 效果图: w ...
- 14.ZooKeeper Java API 使用样例
转自:http://www.aboutyun.com/thread-7332-1-1.html package com.taobao.taokeeper.research.sample; import ...
- 学习笔记(三):jQuery之DOM
1.jQuery属性. 获取元素属性的语法: attr(name) 例子:$("#img1").attr("src"); 设 ...
- 如何把excel同一个单元格内的文字和数字分别提取出来?
平台:excel 2010 目的:把excel同一个单元格内的文字和数字分别提取出来 操作: 假设数据在A1单元格:如果文字在前,B1=left(A1,lenb(A1)-len(A1))可得文字,C1 ...
- python序列中是否包含某个元素
http://outofmemory.cn/code-snippet/9098/python-list-contains-with-in-not-in theList = ['a','b','c'] ...
- java的23中设计模式
一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- ThinkPHP5.0的安装
ThinkPHP5.0的安装很简单: 1.下载“phpstudy”安装 2.下载thinkphp源文件 3.把thinkphp源文件解压并放到phpstudy目录下的“WWW”目录 4.然后开启服务并 ...
- Java Web学习总结(13)——JSP入门
一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...