在单向链表的基础上的扩展
(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;
}
}