【嵌入式Linux C编程】数据结构之链表

2019-07-13 00:18发布

链接表是线性表的链接储存形式。线性表的储存空间是有限的,而链表的储存空间是无限的。表中每个元素由节点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; }