链表分单向链表,双向链表和循环链表 节点的插入有两种,头插法和尾插法 其中头插法是只节点从头节点处插入 尾插法指的是从链表的末尾插入
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct Node { char buf[16]; struct Node * prev; struct Node * next; }Node; Node * create_Node(void) { Node *head; head = (Node*)malloc(sizeof(Node)); if(head == NULL) { return NULL; } head->prev = NULL; head->next = NULL; return head; } void insert_Node(const char buf[],Node* head)//头插法 { Node * new1; Node *tmp ; tmp = head->next; new1 = (Node*)malloc(sizeof(Node)); if(new1 == NULL) { return ; } memcpy(new1->buf,buf,16); new1->next = head->next; head->next = new1; new1->prev = head; if(tmp != NULL)//判断头节点的下一个是不是空 tmp->prev = new1; return; } void insert_Node_end(const char buf[],Node * head) //尾插法 { Node *new1; Node *tmp; tmp = head; for(;;) { if(tmp->next == NULL) break; tmp = tmp->next; } new1 = (Node*)malloc(sizeof(Node)); if(new1 == NULL) { return ; } memcpy(new1->buf,buf,16); tmp->next = new1; new1->prev = tmp; new1->next = NULL; } void print_data(Node *head) { Node *tmp; for(tmp = head->next;;tmp = tmp->next) { printf("data is %s\n",tmp->buf); if(tmp->next == NULL) break; } return; } int main() { Node *head; head = create_Node(); insert_Node("abcdefg1",head); insert_Node("abcdefg2",head); insert_Node("abcdefg3",head); insert_Node("abcdefg4",head); insert_Node_end("abcdefg1",head); insert_Node_end("abcdefg2",head); insert_Node_end("abcdefg3",head); insert_Node_end("abcdefg4",head); print_data(head); return 0; }