链表(LinkedList) C 语言实现
来源:互联网 发布:淘宝网店托管靠谱 编辑:程序博客网 时间:2024/04/25 14:24
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
单链表有一个头节点head,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为NULL。如图:
上图还给出这样一层含义,链表中的各节点在内存的存储地址不是连续的,其各节点的地址是在需要时向系统申请分配的,系统根据内存的当前情况,既可以连续分配地址,也可以跳跃式分配地址。
单向链表程序的实现:
#include <stdio.h>#include <stdlib.h>struct student { int score; struct student *next;};typedef struct student NODE; //typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。简化一些比较复杂的类型声明。NODE *create(); //创建链表void insert(NODE *head, NODE *pnew, int i); //插入void delete(NODE *head, int i); //删除void allClear(NODE *head); //清除链表的所有节点,包含头节点。void display(NODE *head); //打印链表int main(int argc, const char * argv[]) { NODE *head, *pnew; //创建链表 head = create(); //打印链表 display(head); //插入一个新节点 pnew = (NODE*)malloc(sizeof(NODE)); pnew->score = 99; insert(head, pnew, 1); //打印链表 display(head); //删除 delete(head, 0); //打印链表 display(head); //清除链表的所有节点,包含头节点。 allClear(head); //打印链表 display(head); return 0;}//创建链表NODE *create() { NODE *head, *tail, *pnew; int score; head = (NODE*)malloc(sizeof(NODE)); //创建头节点。 if (head == NULL) { printf("创建失败!"); return NULL; } head->next = NULL; tail = head; printf("输入学生成绩:"); while (1) { scanf("%d", &score); if (score < 0) //成绩为负是退出循环 break; pnew = (NODE*)malloc(sizeof(NODE)); //创建新节点 if (pnew == NULL) { printf("创建失败!"); return NULL; } pnew->score = score; pnew->next = NULL; tail->next = pnew; //新节点插入到表尾 tail = pnew; //为指针指向当前的尾节点 } printf("返回头节点"); return head;}//插入 头结点不算,从有数据的开始算第一个void insert(NODE *head, NODE *pnew, int i) { NODE *p = head; int j; for (j = 0; j < i && p != NULL; j++) { p = p->next; if (p == NULL) { printf("\n与插入的节点不存在!"); return; } } pnew->next = p->next; p->next = pnew;}//删除 头结点不算,从有数据的开始算第一个void delete(NODE *head, int i) { NODE *p = head, *pnew; int j; for (j = 0; j < i && p != NULL; j++) { p = p->next; if (p == NULL) { printf("\n删除的节点不存在!"); return; } } pnew = p->next; p->next = pnew->next; free(pnew);}//清除链表的所有节点,包含头节点。void allClear(NODE *head) { NODE *p, *q; p = head; while (p->next != NULL) { q = p->next; p->next = q->next; free(q); } free(head); //最后删除头节点}//打印链表void display(NODE *head) { printf("\n学生成绩分别是:"); NODE *p; for (p = head->next; p != NULL; p = p->next) { printf("%d ", p->score); }}
0 0
- 链表(LinkedList) C 语言实现
- 链表(LinkedList) Java 语言实现
- C语言实现LinkedList链表数据结构
- JAVA实现LinkedList链表
- java语言实现ArrayList,LinkedList,Heap,Stack
- 链表c语言实现
- 链表-C语言实现
- 链表 C语言实现
- 链表C语言实现
- C++:实现LinkedList 学习抽象数据类型
- C linkedList
- 链表ADT C语言实现
- 链表ADT C语言实现
- 链表(C语言实现)
- LinkedList实现
- LinkedList实现
- LinkedList实现
- LinkedList实现
- jquery outerHeight方法 outerWidth方法
- Memcached常用命令及使用说明
- XStream两分钟教程(译)
- make -C M选项
- c++vector简单实现
- 链表(LinkedList) C 语言实现
- 字符串转化为数字 aotf
- pat 1069. The Black Hole of Numbers (20)
- CLSU-00105: Operating System interface has reported an internal failure
- 可塑性记忆——写在大一之后
- 自定义圆形进度条
- Failed to configure driver: unknown error. Failed to open driver
- iOS开发UI篇—实现UItableview控件数据刷新
- SylixOS的BSP开发实例之S3C2416 【第二篇】内存映射与初始布局