忙里偷闲( ˇˍˇ )闲里偷学【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的使用率非常高.今天借助这个真实 ...
随机推荐
- android notify
notify http://examples.javacodegeeks.com/android/core/ui/notifications/android-notifications-example ...
- POJ 3220 Jessica's Reading Problem
Jessica's Reading Problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12944 Accep ...
- JavaScript--数据结构与算法之排序
排序总结————常见的排序 常见的9中排序(冒泡,选择,插入(二分插入,希尔),归并,快速,堆,计数,基数,桶排序)可分为两类 比较排序:冒泡,选择,插入(二分插入,希尔),归并,堆,快速 非比较排序 ...
- Shiro学习总结(3)——Apache Shiro身份认证
身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...
- JAVA异常机制简述
1.类的继承结构 在JAVA所有的异常对象都是Throwable类的一个子类的实例 Exception包含两个分支,由于程序错误导致的异常属于RuntimeException,比如数组下标越界,空指针 ...
- C#string转换为Datetime
DateTime.ParseExact("0710090000", "MMddHHmmss", CultureInfo.CurrentCulture, Date ...
- C# 映射
public class Myclass1 { private int m_Count = 100; public string love{get;set;} public int Count { g ...
- Maven学习总结(18)——深入理解Maven仓库
一.本地仓库(Local Repository) 本地仓库就是一个本机的目录,这个目录被用来存储我们项目的所有依赖(插件的jar包还有一些其他的文件),简单的说,当你build一个Maven项目的时候 ...
- Oracle学习总结(9)—— Oracle 常用的基本操作
创建用户,相当于在sqlServer中创建一个数据库 create user 用户名 identified by 密码 修改用户密码 alter user 用户名 identified by 新 ...
- ECMall 25个 数据库表 说明文档
ecm_acategory //文章分类表 字段 类型 Null 默认 注释 cate_id int(10) 否 自增ID号,分类ID号 cate_name varchar(100) 否 分类 ...