先说一些设计链表的一些规则和细节:
typedef unsigned cnttype;
typedef char datatype;
1)对于链表应当使用一个头节点:既不使用数据域的节点如:
typedef struct node{
datatype data;
struct node *next;
}node;
也许有人会说这样会浪费数据空间,但是这样会简化算法相应的也就节省了
代码段的空间了。。
例如对于一个没有头节点的链表:
(以下两例均是采用尾插法)
/*创建一个链表:采用尾插法*/
而对于使用头结点的链表接可以节省算法设计代码:
再比如在一个链表中找到一个data值为x的节点并删除之
有头结点的:
而没有头结点的则这样设计算法:
2)对于双链表:
typedef struct node{
datatype data;
struct node *next;
struct node *prev;
}node;
node *head; /*指向首节点*/
node *tail; /*指向尾节点*/
应当有head->prev == tail-> next == NULL;
而不是head->prev == head;
tail->next == tail;
因此:初始化时先建立一个首节点 node *head
head = (node *)calloc(1, sizeof(node));
首节点初始化:
head->prev = head->next = NULL;
而不是:
head->prev = head->next = head; /*linux内核是这样做的,读者可以按情况考虑*/