链表
来源:互联网 发布:中国硕士人数知乎 编辑:程序博客网 时间:2024/06/05 02:20
链表
线性表的另一种实现方式。每个结点不仅不含元素本身的信息,还包含了元素之间的逻辑关系:前驱结点包含了后继结点的信息。
不再支持随机访问,但插入和删除操作比顺序表简单。
因为,物理结构不再连续,需要我们自己去维护结点之间的地址关系。
单向链表
定义
在每个结点中除了包含数据域外,还包含了一个指针域,用于指向其后继结点。
类型分为带头结点和不带头结点的链表。
单:链表中地址指向为单向。故遍历的方向也是单向。用结构体定义一个结点
struct elt {
int data;
struct elt *next;
};
头结点
不带头结点的单向链表。
我们一般都会将一个结构体指针变量直接指向链表的起始结点,但更多的时候,我们会把头结点封装到一个结构体中,以便于我们存放更多地有关该链表的信息。(如图)
结构体定义为:
struct elt {
int data;
struct elt *next;
};
删除一个结点
p->next = p->next->next; //main code
增加一个结点
new->next = p->next;
p->next = new;
#include <stdio.h>#include <malloc.h>/*** @time:2016/9/6* @author:j* @info:the implement of single linked list with head node***///the nodestruct NodeN{ int data; struct NodeN *next;};typedef struct NodeN *Node;void init(Node *Lp);void insert(Node L,int data);int isExist(Node L,int data);void del(Node L,int data);void print(Node L);void destroy(Node L);Node search(Node L,int data);Node locate(Node L,int data);void init(Node *Lp) { Node tmp = (struct NodeN *)malloc(sizeof(struct NodeN)); tmp->next = NULL; //empty linked list tmp->data = -999; //first head *Lp = tmp; return;}void insert(Node L,int data) { Node tmp = (struct NodeN *) malloc(sizeof(struct NodeN)); tmp->data = data; if(L->next == NULL) { // empty tmp->next = NULL; L->next = tmp; } else { Node p = locate(L,data); tmp->next = p->next; p->next = tmp; }}void del(Node L,int data) { Node tmp = search(L,data); Node del = tmp->next; if(NULL != tmp) { //I find it tmp->next = tmp->next->next; free(del); }}Node search(Node L,int data) { Node tmp = L; while(tmp->next != NULL) { if(tmp->next->data == data) { return tmp; } tmp = tmp->next; } return NULL;}Node locate(Node L,int data) { Node tmp = L; while(tmp->next != NULL) { if(tmp->next->data > data) { return tmp; } tmp = tmp->next; } return tmp;}void print(Node L) { Node tmp = L->next; while(tmp!=NULL) { printf("data is %d\t",tmp->data); printf("next address is %d",tmp->next); printf("\n"); tmp = tmp->next; }}void destroy(Node L) { if(L->next!=NULL) destroy(L->next); free(L);}int main() { Node L1; init(&L1); insert(L1,10); insert(L1,5); insert(L1,8); del(L1,8); print(L1); return 0;}
0 0
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 开放才能进步!Angular和Wijmo一起走过的日子
- [多项式求逆 模板题] BZOJ 4555 [Tjoi2016&Heoi2016]求和
- 文章标题
- 在C#中实现Socket端口复用
- 什么是设计知识?
- 链表
- 欢迎使用CSDN-markdown编辑器
- CXF整合spring实现webservice
- 三星手机开发游戏工具 成为游戏必备神器
- 配置git的远程仓库服务器
- 上传本地文件到github
- linux下安装apache
- 【Java必会】一个保姆与两只宠物的“代理”故事(附源码)
- 关于去除Demo中的广告相关