数据结构---双向链表
在单向链表的基础上的扩展
(1)初始化
typedef struct Node
{int data;struct Node *pre;//指向前一个结点struct Node *next;//指向后一个结点
}Node,*DoubleLinkList;
//初始化,产出一个头结点
DoubleLinkList InitList(){//分配内存Node *head = (Node*)malloc(sizeof(Node));if(head == NULL){printf("内存申请失败\n");return head;}head->pre = NULL;head->next = NULL;//没有对data赋值,不代表data没有数据return head;
}
(2)添加数据
1,头插法
//头插法
DoubleLinkList headInsert(DoubleLinkList l,int k){//1.新结点Node *s = (Node*)malloc(sizeof(Node));//判断if(s == NULL){printf("内存申请失败\n");return l;}//2.初始化新结点s->data = k;s->next = l->next;s->pre = l;//添加if(l->next != NULL){l->next->pre = s;}l->next = s; return l;
}
2,尾插法
//尾插法
DoubleLinkList tailInsert(DoubleLinkList l,int k){//1.新结点Node *s = (Node*)malloc(sizeof(Node));//判断if(s == NULL){printf("内存申请失败\n");return l;}//2.初始化新结点s->data = k;s->next = NULL;//查找并添加Node *temp = l;while(temp->next!=NULL){temp = temp->next;}s->pre = temp;temp->next = s;return l;}
3,中间插入
//中间插入
DoubleLinkList middleInsert(DoubleLinkList l,int x,int k){//新结点Node *s = (Node*)malloc(sizeof(Node));s->data = k;Node*p = Find(l,x);if(p == NULL){printf("查无此数据\n");return l;}s->next = p->next;if(p->next!=NULL){p->next->pre = s;}p->next = s;s->pre = p;return l;}
(3)查找
//查找
Node *Find(DoubleLinkList l,int x){Node *temp = l->next;while(temp!=NULL&&temp->data!=x){temp = temp->next;}return temp;
}
(4)删除
//删除
DoubleLinkList delete(DoubleLinkList l,int x){Node *temp = Find(l,x);if(temp == NULL){printf("查无此数据\n");return l;}temp->pre->next = temp->next;if(temp->next != NULL){temp->next->pre = temp->pre;}free(temp);temp = NULL;return l;
}
(5)修改
//修改
DoubleLinkList changeList(DoubleLinkList l,int x,int k){Node* temp = Find(l,x);if(temp == NULL){printf("查无此数据\n");return l;}temp->data = k;return l;
}
(6)输出
//输出
void printff(DoubleLinkList l){Node *temp = l->next;if(temp == NULL){printf("空链表,数据为空\n");}while(temp!=NULL){printf("%d ",temp->data);temp = temp->next;}
}