1. 双向链表 #include <stdio.h> #include <stdlib.h> struct dnode { int data; struct dnode * prev, *next; }; //创建一个带头结点的双向循环链表 struct dnode * dlink_create(void) { struct dnode * head = NULL; head = (struct dnode *)malloc(sizeof(struct dnode)); if (head == NULL) { printf("malloc error!/n"); return NULL; } head->data = 0; head->next = head; head->prev = head; return head; } int insert_node(struct dnode * head, int num) { struct dnode * head_t = head->next; //创建一个新结点 struct dnode * temp = (struct dnode *)malloc(sizeof(struct dnode)); if (head == NULL) { printf("malloc error!/n"); return -1; } temp->data = num; while (head_t != head) //寻找插入点 { head_t = head_t->next; } //插入结点 temp->next = head_t->prev; temp->prev = head_t; head_t->next->prev = temp; head_t->next = temp; return 0; } //显示 void show_link(struct dnode * head) { struct dnode * head_t = head->next; while (head_t != head) { printf("%d/n",head_t->data); head_t = head_t->next; } } //删除 int delete_node(struct dnode * head, int num) { struct dnode * head_t = head->next; struct dnode * temp = NULL; while (head_t != head) { if (head_t->data == num) break; head_t = head_t->next; } if (head_t == head) { printf("not find/n"); return -1; } temp = head_t; //删除操作 temp->prev->next = head_t->next; head_t->next->prev = temp->prev; return 0; } int main(int argc, char* argv[]) { struct dnode * head; head = dlink_create(); insert_node(head, 123); insert_node(head, 456); show_link(head); printf("after delete... show/n"); delete_node(head,123); show_link(head); return 0; }