-
构建结构体
typedef struct _Linklist{//构建结构体 int data;//放数值 struct _Linklist *prev;//连接前一个节点 struct _Linklist *next;//连接后一个节点 }Link;
-
构建头节点
Link* Link_start(){//构建头节点 Link *head = (Link *)malloc(sizeof(Link)); head->prev = NULL; head->prev = NULL; return head; }
-
双向链表判空
bool IsEmpty(Link *head){//双向链表判空 if(head->next == NULL && head->prev == NULL){//为空 return 1; }else{ return 0; } }
-
头插法构建双向链表
Link* Link_list_head(Link *head){//头插法输出是反着的 Link *head = Link_start(); int number; while(scanf("%d",&number) == 1){ Link *p = (Link *)malloc(sizeof(Link)); p->data = number; if(head->next != NULL){ head->next->prev = p; } p->next = head->next; head->next = p; p->prev = head; } getchar(); return head; }
-
尾插法构建双向链表
Link* Link_list_tail(Link *head){//尾插法 Link *head = Link_start(); int number; Link *tail = head; while(scanf("%d",&number) == 1){ Link *p = (Link*)malloc(sizeof(Link)); p->data = number; tail->next = p; p->prev = tail; tail = p; } tail->next = NULL; getchar(); return head; }
-
查找特定值
Link* Find(Link* head,int key){//查找某值key Link *p = head->next; for(;p;p = p->next){ if(p->data == key){ printf("Find\n"); return p; } } printf("No Find\n"); return p; }
-
在b节点前插入a节点
void Insert(Link* a,Link* b){//在b节点前插入a b->prev->next = a; a->prev = b->prev; a->next = b; b->prev = a; printf("OK\n"); }
-
删除给定节点
void Del(Link* p){//删除p节点 p->prev->next = p->next; if(p->next){ p->next->prev = p->prev; } free(p); p = NULL; printf("OK\n"); }
-
删除链表
void Del_All(Link *head){//删除链表 Link *p = head->next; Link *q = q; while(p){ p = p->next; free(q); q = p; } printf("OK\n"); }
-
显示链表
void Print(Link *head){//显示链表 Link *p = head; while(p){ printf("%d ",p->data); p = p->next; } putchar("\n"); }
-
交换两个节点
void Swap(Link*p,Link*q){//交换两个节点 if(p->next){ p->next->prev = q; } if(q->next){ q->next->prev = p; } p->prev->next = q; q->prev->next = p; p->next = q->next; q->next = p->next; p->prev = q->prev; q->prev = p->prev; printf("OK\n"); }
总代码:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct _Linklist{//构建结构体
int data;//放数值
struct _Linklist *prev;//连接前一个节点
struct _Linklist *next;//连接后一个节点
}Link;
Link* Link_start(){//构建头节点
Link *head = (Link *)malloc(sizeof(Link));
head->prev = NULL;
head->prev = NULL;
return head;
}
bool IsEmpty(Link *head){//双向链表判空
if(head->next == NULL && head->prev == NULL){//为空
return 1;
}else{
return 0;
}
}
Link* Link_list_head(Link *head){//头插法输出是反着的
Link *head = Link_start();
int number;
while(scanf("%d",&number) == 1){
Link *p = (Link *)malloc(sizeof(Link));
p->data = number;
if(head->next != NULL){
head->next->prev = p;
}
p->next = head->next;
head->next = p;
p->prev = head;
}
getchar();
return head;
}
Link* Link_list_tail(Link *head){//尾插法
Link *head = Link_start();
int number;
Link *tail = head;
while(scanf("%d",&number) == 1){
Link *p = (Link*)malloc(sizeof(Link));
p->data = number;
tail->next = p;
p->prev = tail;
tail = p;
}
tail->next = NULL;
getchar();
return head;
}
Link* Find(Link* head,int key){//查找某值key
Link *p = head->next;
for(;p;p = p->next){
if(p->data == key){
printf("Find\n");
return p;
}
}
printf("No Find\n");
return p;
}
void Insert(Link* a,Link* b){//在b节点前插入a
b->prev->next = a;
a->prev = b->prev;
a->next = b;
b->prev = a;
printf("OK\n");
}
void Del(Link* p){//删除p节点
p->prev->next = p->next;
if(p->next){
p->next->prev = p->prev;
}
free(p);
p = NULL;
printf("OK\n");
}
void Del_All(Link *head){//删除链表
Link *p = head->next;
Link *q = q;
while(p){
p = p->next;
free(q);
q = p;
}
printf("OK\n");
}
void Print(Link *head){//显示链表
Link *p = head;
while(p){
printf("%d ",p->data);
p = p->next;
}
putchar("\n");
}
void Swap(Link*p,Link*q){//交换两个节点
if(p->next){
p->next->prev = q;
}
if(q->next){
q->next->prev = p;
}
p->prev->next = q;
q->prev->next = p;
p->next = q->next;
q->next = p->next;
p->prev = q->prev;
q->prev = p->prev;
printf("OK\n");
}
int main(){
}