c语言实现增删双向链表

#include <stdio.h>
#include <stdlib.h>
#include "doulist.h"
//c没有引用。c++才有
//内部功能
Pnode createNode(DataType data)
{
Pnode p = (Pnode)malloc(sizeof(Node));
if (p != NULL)
{
p->data = data;
p->next = NULL;
p->prev = NULL;
}
return p;
}
int insertNextNode(Pnode p1, Pnode p2)
{
if (p1 == NULL&&p2 == NULL)
{
return -1;
}
if (p1->next == NULL)
{
p1->next = p2;
p2->prev = p1;
}
else
{
Pnode p3 = p1->next;
p1->next = p2;
p2->prev = p1;


p2->next = p3;
p3->prev = p2;
}
return 0;
}
int insertPrevNode(Pnode p3, Pnode p2)
{
if (NULL==p3&&NULL==p2)
{
return -1;
}
if (NULL==p3->prev)
{
p2->next = p3;
p3->prev = p2;
}
else
{
Pnode p1 = p3->prev;
p3->prev = p2;
p2->next = p3;


p2->prev = p1;
p1->next = p2;
}
return 0;
}
int deleteNextNode(Pnode p)
{
if (NULL == p)
{
return 0;
}
Pnode p2 = p->next;
if (NULL == p2)
{
return 0;
}
if (NULL == p2->next)
{
free(p2);
p->next = NULL;
}
else
{
Pnode p3 = p2->next;
free(p2);


p->next = p3;
p3->prev = p;
}
return 0;
}
int deletePrevNode(Pnode p3)
{
if (NULL==p3)
{
return 0;
}
Pnode p2 = p3->prev;


if (p2->prev == NULL)
{
free(p2);
p3->prev = NULL;
}
else
{
Pnode p1 = p2->prev;
free(p2);


p3->prev = p1;
p1->next = p3;
}
return 0;
}
void douListPrint(Pnode head)
{
Pnode p = head;
printf("正向打印:");
while (p != NULL)//正向打印
{
printf("%d  ", p->data);
if (p->next == NULL)
{
break;
}
p = p->next;
}
printf("\n反向打印:");
while (p != NULL)//反向打印
{
printf("%d  ", p->data);
p = p->prev;
}
printf("\n----------------------------\n");


}


//01增
int douListInsertDataBySort(Pnode *phead, DataType data)
{
if (NULL == phead)
{
return 1;
}
Pnode pNew = createNode(data);
if (NULL == pNew)
{
return -1;
}
Pnode head = *phead;
if (NULL == head)
{
*phead = pNew;
return 0;
}


if (data < head->data)//头插
{
//insertNextNode(pNew, head);
pNew->next = head;
head->prev = pNew;
*phead = pNew;
return 0;
}


Pnode p = head;
while (p->next != NULL)
{
if (p->data>data)
{
break;
}
p = p->next;
}
if (p->data > data)//中间插
{
insertPrevNode(p, pNew);
}
else//末尾插
{
insertNextNode(p, pNew);
}
return 0;
}


void test1()内部功能Pnode createNode(DataType data)
{
Pnode p1 = createNode(1);
Pnode p2 = createNode(2);
Pnode p3 = createNode(3);
Pnode p4 = createNode(4);


p1->next = p2;


p2->prev = p1;
p2->next = p3;


p3->prev = p2;
p3->next = p4;


p4->prev = p3;


douListPrint(p1);


}
void test2()内部功能insertNextNode
{
Pnode p1 = createNode(1);
Pnode p2 = createNode(2);
Pnode p3 = createNode(3);
Pnode p4 = createNode(4);
insertNextNode(p1, p3);
insertNextNode(p1, p2);
insertNextNode(p3, p4);






douListPrint(p1);


}
void test3()内部功能insertNextNode
{
Pnode p1 = createNode(1);
Pnode p2 = createNode(2);
Pnode p3 = createNode(3);
Pnode p4 = createNode(4);
insertPrevNode(p4, p2);
douListPrint(p2);
insertPrevNode(p4, p3);
douListPrint(p2);
insertPrevNode(p2, p1);
douListPrint(p1);


}
void test4()
{
Pnode p1 = createNode(1);
Pnode p2 = createNode(2);
Pnode p3 = createNode(3);
Pnode p4 = createNode(4);


p1->next = p2;


p2->prev = p1;
p2->next = p3;


p3->prev = p2;
p3->next = p4;


p4->prev = p3;
douListPrint(p1);
deleteNextNode(p1);
douListPrint(p1);
deleteNextNode(p4);
douListPrint(p1);
deleteNextNode(p3);
douListPrint(p1);


}
void test5()// deletePrevNode(
{
Pnode p1 = createNode(1);
Pnode p2 = createNode(2);
Pnode p3 = createNode(3);
Pnode p4 = createNode(4);


p1->next = p2;


p2->prev = p1;
p2->next = p3;


p3->prev = p2;
p3->next = p4;


p4->prev = p3;
douListPrint(p1);
deletePrevNode(p4);
douListPrint(p1);
deletePrevNode(p2);
douListPrint(p2);


}
void test6()
{
Pnode head = NULL;
douListInsertDataBySort(&head, 2);
douListInsertDataBySort(&head, 4);
douListPrint(head);
douListInsertDataBySort(&head, 1);
douListPrint(head);
douListInsertDataBySort(&head, 3);
douListPrint(head);










}
int main()
{
//test1();
//test2();
//test3();
//test4();
//test5();
test6();
getchar();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值