【嵌入式Linux C编程】数据结构之链表
2018-03-26 21:25
369 查看
链接表是线性表的链接储存形式。线性表的储存空间是有限的,而链表的储存空间是无限的。
表中每个元素由节点Node构成,每个节点中分为一个数据区域,如 int data ,和一个指针区域 struct struct_name *next。
一条链表的第一个节点为头结点,一般不存放数据,当做头指针使用,指向下一个用来存放数据的节点。
链表的定义typedef char ListData;
typedef struct node { //链表结点
ListData data; //结点数据域
struct node * link; //结点链域
} ListNode;
typedef ListNode * LinkList;
LinkList first; 链表插入节点int InsertLink(Node *l, int p, DataType e)
{
Node *q = l;
int j = 1;
if (NULL == l) //入参判断
{
return FAILURE;
}
if (p > LengthLink(l) + 1) //2、判断插入位置
{
return FAILURE;
}
while (j < p) //移动指针到要插入位置的前一个
{
q = q->next;
j++;
}
if (j > p) //判断位置是否合法(如果q为空或者p=0,退出)
{
return FAILURE;
}
Node *n = (Node *)malloc(sizeof(Node)); //给结点分配空间
if (NULL == n)
{
return FAILURE;
}
n->data = e;
n->next = q->next;
q->next = n;
return SUCCESS;
}删除节点int DeleteLink(Node *l, int p)
{
DataType e;
Node *q = l;
int j = 1;
if (NULL == l)
{
return FAILURE;
}
if (p > LengthLink(l)) //8、判断删除位置
{
return FAILURE;
}
while (j < p) //移动指针到要插入位置的前一个
{
q = q->next;
j++;
}
if (j > p) //判断位置是否合法(如果q为空或者p=0,退出)
{
return FAILURE;
}
Node *n = q->next;
e = n->data;
q->next = n->next;
free(n);
return e;
}销毁链表int DestroyLink(Node **l)
{
if (NULL == (*l) || (*l)->next != NULL)
{
return FAILURE;
}
free(*l);
(*l) = NULL;
return SUCCESS;
}
表中每个元素由节点Node构成,每个节点中分为一个数据区域,如 int data ,和一个指针区域 struct struct_name *next。
一条链表的第一个节点为头结点,一般不存放数据,当做头指针使用,指向下一个用来存放数据的节点。
链表的定义typedef char ListData;
typedef struct node { //链表结点
ListData data; //结点数据域
struct node * link; //结点链域
} ListNode;
typedef ListNode * LinkList;
LinkList first; 链表插入节点int InsertLink(Node *l, int p, DataType e)
{
Node *q = l;
int j = 1;
if (NULL == l) //入参判断
{
return FAILURE;
}
if (p > LengthLink(l) + 1) //2、判断插入位置
{
return FAILURE;
}
while (j < p) //移动指针到要插入位置的前一个
{
q = q->next;
j++;
}
if (j > p) //判断位置是否合法(如果q为空或者p=0,退出)
{
return FAILURE;
}
Node *n = (Node *)malloc(sizeof(Node)); //给结点分配空间
if (NULL == n)
{
return FAILURE;
}
n->data = e;
n->next = q->next;
q->next = n;
return SUCCESS;
}删除节点int DeleteLink(Node *l, int p)
{
DataType e;
Node *q = l;
int j = 1;
if (NULL == l)
{
return FAILURE;
}
if (p > LengthLink(l)) //8、判断删除位置
{
return FAILURE;
}
while (j < p) //移动指针到要插入位置的前一个
{
q = q->next;
j++;
}
if (j > p) //判断位置是否合法(如果q为空或者p=0,退出)
{
return FAILURE;
}
Node *n = q->next;
e = n->data;
q->next = n->next;
free(n);
return e;
}销毁链表int DestroyLink(Node **l)
{
if (NULL == (*l) || (*l)->next != NULL)
{
return FAILURE;
}
free(*l);
(*l) = NULL;
return SUCCESS;
}
相关文章推荐
- 【嵌入式学习历程8】数据结构之链表
- 数据结构之链表编程(C++)
- (编程训练)再回首,数据结构——链表上的编程训练_实现多项式运算
- Linux下网络编程(3)——进程间通信(IPC),共享内存,传递结构体数据
- 嵌入式Linux c语言常用数据结构
- linux 内核常用数据结构及算法——list(循环双向链表)
- Linux C 数据结构—-循环链表
- Linux编程细节3-内核-数据结构
- 【嵌入式Linux C编程】2018.3.8 数据类型、运算操作符、基本语句
- 学习javascript数据结构(二)——链表
- 数据结构之单向链表
- 数据结构之链表六:有序链表的建立
- 2016暑假集训7.27 链表 数据结构上机测试1:顺序表的应用
- 数据结构之链表
- 嵌入式Linux网络编程
- [redis读书笔记] 第一部分 数据结构与对象 链表
- 2120 数据结构实验之链表五:单链表的拆分
- 数据结构上机测试2-1:单链表操作A
- 数据结构之链表
- 数据结构实验之链表三:链表的逆置