双向链表的操作

//双向循环列表
typedef struct dnode
{
int data;
struct dnode *preNode,*nextNode;
}dCycleLink;


完成两个操作:

1 插入 dCycleLink* insertData(dCycleLink *head,int num,int data);

2 删除 dCycleLink* deleteData(dCycleLink*head,int data);


实际上,双向循环列表的操作和单向的差不多的,只是 需要多考虑 prenode的这样的一个元素就可以了。好了,上代码


1 插入

// 找到结点之后;
dCycleLink* insertData( dCycleLink *head,int num,int data)
{
assert(head!=NULL);
dCycleLink *p=head;
int count=1;

while(p!=NULL&&count<num)
{
count++;
p=p->nextNode;
}

if(count==num)
{
dCycleLink *s=(dCycleLink*)malloc(sizeof(dCycleLink));
if(s!=NULL&&p!=NULL)
{
  s->data=data;
  s->preNode=p;  //1
  p->nextNode->preNode=s; //2
  s->nextNode=p->nextNode; //3
  p->nextNode=s;  //4
}
cout<<"插入成功!!!"<<endl;
printCycleLink(head);
}
else
{
cout<<"插入失败!!!"<<endl;
}
return head;
}


2 删除

dCycleLink* deleteData( dCycleLink*head,int data )
{
assert(head);
dCycleLink* p=head;

while(p!=NULL&&p->data!=data)
{
p=p->nextNode;
}
//跳出循环:1 p为NULL,没有找到 2 p->data=data,找到结果了
if(p->data==data) 
{
p->preNode->nextNode=p->nextNode;
p->nextNode->preNode=p->preNode;
free(p);
p=NULL;
cout<<"找到了,删除成功!"<<endl;
printCycleLink(head);
}
else
{
cout<<"没有找到,删除失败!"<<endl;
}
return head;
}


3 测试代码

int main()
{
int num;
cout<<"请输入要创建的节点的个数n:";
cin>>num;
dCycleLink* cycleLink;
cycleLink=createDoublyCycleLink(num);
cycleLink=insertData(cycleLink,2,10);
cycleLink=deleteData(cycleLink,2);
return 0;
}



dCycleLink* createDoublyCycleLink( int n )
{
int xValue;
dCycleLink *head,*p,*pre;

cout<<"请输入第1个数字: ";
cin>>xValue;
p=(dCycleLink*)malloc(sizeof(dCycleLink));
p->data=xValue;
p->preNode=NULL;
p->nextNode=NULL;
head=p;
pre=p;

for(int i=1;i<n;i++)
{
cout<<"请输入第"<<i+1<<"个数字: ";
cin>>xValue;
p=(dCycleLink*)malloc(sizeof(dCycleLink));
p->data=xValue;
p->nextNode=NULL;

p->preNode=pre; //体现双向的 特点
pre->nextNode=p;
pre=p;
}

printCycleLink(head);
return head;
}


void printCycleLink(dCycleLink *head )
{
dCycleLink* pNode=head;

cout<<"这个链表的数据是:"<<endl;
while(pNode)
{
cout<<pNode->data<<endl;
pNode=pNode->nextNode;
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值