链表分单向链表,双向链表和循环链表
节点的插入有两种,头插法和尾插法
其中头插法是只节点从头节点处插入
尾插法指的是从链表的末尾插入
#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;
}