双向链表的很多操作和单链表是相同的,比如求长度的操作,查找元素的操作。不过有些操作是有一些区别的,如插入、删除元素。
#include <stdlib.h> /*用到了srand函数,所以要有这个头文件*/
#include <time.h> /*用到了time函数,所以要有这个头文件*/
#include <iostream>
using namespace std;
typedef int ElemType;
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef struct DulNode{
ElemType data;
struct DulNode* prior;
struct DulNode* next;
}DulNode ,*DulLinkList;
//尾插法
void creatList(DulLinkList& head, int n){
DulLinkList pTail,pNew;
srand ( time(0));
head= ( DulLinkList) malloc( sizeof( DulNode));
pTail=head;
pTail->next=NULL;
for (int i=0; i < n; i++){
pNew =( DulLinkList) malloc ( sizeof( DulNode)) ;
pNew->data =rand() % 100 +1; //100以内 随机数
pTail->next=pNew;
pNew->prior= pTail;
pNew->next = NULL;
pTail = pNew;
}
}
void printList( DulLinkList head){
if ( ! head &&! head->next )
cout<<"链表为空"<<endl;
else{
head = head->next;
while( head){
cout<< head->data << " ,";
head=head->next;
}
}
cout<<endl;
}
Status deleteNode( DulLinkList& head ,int i , ElemType& e){
int j;
DulLinkList p,q;
p=head;
j=1;
while (p&& j<i)
{
p=p->next;
++j;
}
if ( !p ||j>i)
{
return ERROR;
}
q=p->next;
if ( q->next)
{
p->next=q->next;
q->next->prior=p;
}
else{ //最后一个元素
p->next=NULL;
}
e=q->data;
free( q);
return OK;
}
Status insertNode ( DulLinkList& head ,int i ,const ElemType e){
DulLinkList p=head;
DulLinkList q;
int j=1;
for ( ;j<i ;j++)
{
p=p->next;
if (!p)
{
break;
}
}
if (j>i ||NULL==p)
return ERROR;
q=( DulLinkList) malloc( sizeof (DulNode) );
if ( p->next)
{
q->next=p->next;
q->prior=p;
p->next->prior=q;
p->next=q;
}
else
{
q->next=p->next;
q->prior=p;
p->next=q;
}
q->data =e;
return OK;
}
int main (){
DulLinkList dulList1;
creatList(dulList1 ,13);
printList( dulList1);
ElemType e;
deleteNode(dulList1 , 13 , e);
printList( dulList1);
cout<<e<<endl;
cout<<insertNode( dulList1, 13 , 111) <<endl;
printList( dulList1);
return 0;
}