#include <stdio.h>#include <stdlib.h>typedef struct line { struct line * prior; int data; struct line * next;}line;//双链表的创建line* initLine(line * head);//双链表插入元素,add表示插入位置line * insertLine(line * head, int data, int add);//双链表删除指定元素line * delLine(line * head, int data);//双链表中查找指定元素int selectElem(line * head, int elem);//双链表中更改指定位置节点中存储的数据,add表示更改位置line *amendElem(line * p, int add, int newElem);//输出双链表的实现函数void display(line * head);int main() { line * head = NULL; //创建双链表 printf("初始链表为:\n"); head = initLine(head); display(head); //在表中第 3 的位置插入元素 7 printf("在表中第 3 的位置插入新元素 7:\n"); head = insertLine(head, 7, 3); display(head); //表中删除元素 2 printf("删除元素 2:\n"); head = delLine(head, 2); display(head); printf("元素 3 的位置是:%d\n", selectElem(head, 3)); //表中第 3 个节点中的数据改为存储 6 printf("将第 3 个节点存储的数据改为 6:\n"); head = amendElem(head, 3, 6); display(head); return 0;}line* initLine(line * head) { int i = 0; line * list = NULL; //从内存中申请一片内存 head = (line*)malloc(sizeof(line)); //初始化 head->prior = NULL; head->next = NULL; head->data = 1; //我们需要保证head的位置不变,所以连接链表由list执行 list = head; for (i = 2; i <= 3; i++) { //创建链表体 line * body = (line*)malloc(sizeof(line)); body->prior = NULL; body->next = NULL; //i=2, 3 body->data = i; //让链表的头下一个元素指向体 list->next = body; body->prior = list; list = list->next; /* list = head; head ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ create body list->next = body; head list -> body ~~~~~~~~~~~~~~~~~~~~~~~~ body->prior = list' head list <- -> body ~~~~~~~~~~~~~~~ list - >next = body; list head -> body ~~~~~~~~~~~~~~~~ */ } return head;}line * insertLine(line * head, int data, int add) { //新建数据域为data的结点 line * temp = (line*)malloc(sizeof(line)); temp->data = data; temp->prior = NULL; temp->next = NULL; //插入到链表头,要特殊考虑 if (add == 1) { temp->next = head; head->prior = temp; head = temp; } else { int i = 0; line * body = head; //找到要插入位置的前一个结点 for (i = 1; i < add - 1; i++) { body = body->next; if (body == NULL) { printf("插入位置有误\n"); break; } } if (body) { //判断条件为真,说明插入位置为链表尾 if (body->next == NULL) { body->next = temp; temp->prior = body; } else { body->next->prior = temp; temp->next = body->next; body->next = temp; temp->prior = body; } } } return head;}line * delLine(line * head, int data) { line * temp = head; //遍历链表 while (temp) { //判断当前结点中数据域和data是否相等,若相等,摘除该结点 if (temp->data == data) { temp->prior->next = temp->next; temp->next->prior = temp->prior; free(temp); return head; } temp = temp->next; } printf("链表中无该数据元素\n"); return head;}//head为原双链表,elem表示被查找元素int selectElem(line * head, int elem) { //新建一个指针t,初始化为头指针 head line * t = head; int i = 1; while (t) { if (t->data == elem) { return i; } i++; t = t->next; } //程序执行至此处,表示查找失败 return -1;}//更新函数,其中,add 表示更改结点在双链表中的位置,newElem 为新数据的值line *amendElem(line * p, int add, int newElem) { int i = 0; line * temp = p; //遍历到被删除结点 for (i = 1; i < add; i++) { temp = temp->next; if (temp == NULL) { printf("更改位置有误!\n"); break; } } if (temp) { temp->data = newElem; } return p;}//输出链表的功能函数void display(line * head) { line * temp = head; while (temp) { if (temp->next == NULL) { printf("%d\n", temp->data); } else { printf("%d->", temp->data); } temp = temp->next; }}