双向链表
—— 头文件
#include <stdio.h>
#include <stdlib.h>
结构体声明双向链表节点
typedef struct two_way_linked_list{
struct two_way_linked_list *prior;
int data;
struct two_way_linked_list *next;
} LinkList;
构造创建双向链表的函数
LinkList *initLink(int n){
LinkList *head = (LinkList*)malloc(sizeof(LinkList));
head->prior = NULL;
head->next = NULL;
scanf("%d", &head->data);
LinkList *list = head;
for(int i = 2; i <= n; i++) {
LinkList *body = (LinkList*)malloc(sizeof(LinkList));
body->prior = NULL;
body->next = NULL;
scanf("%d", &body->data);
list->next = body;
body->prior = list;
list = list->next;
}
return head;
}
构造展示双向链表的函数
void display(LinkList *head){
LinkList *temp = head;
while(temp){
if(temp->next != NULL){
printf("%d <-> ", temp->data);
}else{
printf("%d\n", temp->data);
}
temp = temp->next;
}
}
构造插入双向链表元素的函数
LinkList *insertLink(LinkList *head, int data, int position){
LinkList *temp = (LinkList*)malloc(sizeof(LinkList));
temp->data = data;
temp->next = NULL;
temp->prior = NULL;
if (position == 1){
temp->next = head;
head->prior = temp;
head = temp;
}else{
LinkList *body = head;
for(int i = 1; i < position-1; i++){
body = body->next;
}
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;
}
构造删除双向链表元素的函数
LinkList *delLink(LinkList *head, int data){
LinkList *temp = head;
if(temp->data == data){
head = temp->next;
free(temp);
return head;
}
while (temp) {
if (temp->data == data && temp->next == NULL) {
temp->prior->next = NULL;
free(temp);
return head;
}else if(temp->data == data){
temp->prior->next = temp->next;
temp->next->prior = temp->prior;
free(temp);
return head;
}
temp = temp->next;
}
printf("链表中无该数据元素");
return head;
}
构造查找双向链表元素的函数
int selectElem(LinkList *head, int elem){
LinkList *temp = head;
int index = 1;
while(temp->next != NULL){
if(temp->data == elem){
return index;
}
temp = temp->next;
index++;
}
return -1;
}
构造更新双向链表元素的函数
LinkList *updateElem(LinkList *head, int elem, int newelem){
int position = selectElem(head, elem);
LinkList *temp = head;
for (int i = 1; i < position; i++){
temp = temp->next;
}
temp->data = newelem;
return head;
}
—— 主函数
int main(void){
LinkList *head = initLink(5);
display(head);
printf("链表中第3个节点的直接前驱的数据域:%d\n",head->next->next->prior->data);
LinkList *newhead = insertLink(head, 7, 6);
display(newhead);
LinkList *newhead_ = delLink(newhead, 7);
display(newhead_);
printf("元素4在双向链表中的位置为:%d\n", selectElem(newhead_, 4));
LinkList *newhead__ = updateElem(newhead_, 2, 100);
display(newhead__);
return 0;
}