实例实现双向链表的创建、测长、打印、插入、删除:
<span style="font-size:18px;">//dbList.h文件
typedef struct student
{
int data;
struct student *next;
struct student *pre;
}dnode;
typedef dnode * dbList;
typedef dnode * dbPosition;
//建立双链表
dbList Create();
//双链表测长
int Length (dbList L);
//双链表的打印
void Print(dbList L);
//双链表删除结点
dbList Delete(dbList L, int num);
//双链表插入某个结点
dbList Insert(dbList L,int num);
</span>
<span style="font-size:18px;">//dbList.cpp文件
#include <iostream>
#include <stdio.h>
#include <string>
#include <conio.h>
using namespace std;
#include "doubleList.h"
/************************************************************************/
/* 功能:编程实现一个双链表的建立(只有头指针,没有头结点) */
/* 参数:无 */
/* 返回:链表的头指针 */
/************************************************************************/
dbList Create()
{
dbList head,p,s;
int x,cycle = 1;
head = (dbList)malloc(sizeof(dnode));
p= head;
while(cycle)
{
printf("\nPlease input the data: ");
scanf("%d",&x);
if(x != 0)
{
s = (dbList)malloc(sizeof(dnode));
s->data = x;
printf("\n %d",s->data);
p->next = s;
s->pre = p;
p = s;
}
else
cycle = 0;
}
head = head->next;
head->pre = NULL;
p->next = NULL;
return head;
}
/************************************************************************/
/* 功能:编程实现一个双链表的测长 */
/* 参数:双链表的头指针 */
/* 返回:双链表的长度 */
/************************************************************************/
int Length( dbList L )
{
int n = 0;
dbList p;
p = L;
while(p != NULL)
{
p = p->next;
n++;
}
return n;
}
/************************************************************************/
/* 功能:编程实现一个双链表的打印 */
/* 参数:双链表的头指针 */
/* 返回:无 */
/************************************************************************/
void Print( dbList L )
{
dbList p;
int n = Length(L);
printf("\nNow,These %d Records are ",n);
p = L;
while(p != NULL)
{
printf("\n %d \n",p->data);
p = p->next;
}
}
/************************************************************************/
/* 功能:编程实现双链表删除一个结点 */
/* 参数:L:双链表的头指针 num:删除该数据所在的结点保存的值 */
/* 返回:双链表的头指针 */
/************************************************************************/
dbList Delete( dbList L, int num )
{
dbList p;
p = L;
while(p->data != num && p->next != NULL)
p = p->next;
if(p->data == num)
{
if(p == L) //需要删除的是第一个结点
{
L= p->next;
L->pre = NULL;
free(p);
}
else if(p->next == NULL) //需要删除的是最后一个结点
{
p->pre->next = NULL;
free(p);
}
else //需要删除的是中间的某个节点
{
p->pre->next = p->next;
p->next->pre = p->pre;
free(p);
}
}
else
{
printf(("\n%d could not been found \n"),num);
}
return L;
}
/************************************************************************/
/* 功能:编程实现在链表中插入一结点,插入的位置由从小到大排序决定 */
/* 参数:L 指向链表的头指针 num:指定插入的数据值 */
/* 返回:指向头结点的指针 */
/************************************************************************/
dbList Insert( dbList L,int num )
{
dbList p0,p1;
p0 = (dbList)malloc(sizeof(dbList));
p0->data = num;
p1 = L;
while(p0->data >p1->data && p1->next != NULL)
{
p1 = p1->next;
}
if(p0->data <= p1->data)
{
if(p1 == L) //插入到最前面去
{
p0->next = p1;
p1->pre =p0;
L = p0;
}
else //插在中间的某个位置
{
p1->pre->next = p0;
p0->pre = p1->pre;
p0->next = p1;
p1->pre = p0;
}
}
else //插在最后的位置(num值大于所有结点数据)
{
p1->next = p0;
p0->pre = p1;
p0->next = NULL;
}
return L;
}
int main()
{
dbList L;
L = Create();
Print(L);
Delete(L,5);
Print(L);
Insert(L,10);
Print(L);
return 0;
}</span>
程序输入/ 输出: