您的位置:首页 > 编程语言 > C语言/C++

c语言实现增删双向链表

2016-12-02 16:38 399 查看
#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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: