双向链表实现 插入删除

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

//双向链表 结点
typedef struct Node{

	int data;
	Node * prior;
	Node * next;
}Node;

//链表管理 节点
typedef struct Link{

	Node * front;
	Node * rear;
}Link;

//链表的初始化
void inital(Link &link){

	link.front=NULL;
	link.rear=NULL;

}

//链表的插入
void insert(Link &link,int x){
    //创建新节点
	Node * p=(Node *)malloc(sizeof(Node));
	p->data=x;
    p->prior=NULL;
    p->next=NULL;

	if(link.rear==NULL){
	link.rear=p;
	link.front=p;
	}else{
	Node * q=link.rear;
	q->next=p;
	p->prior=q;
	link.rear=p;
	}

}

//链表的删除
void remove(Link &link,int x){

	if(link.rear==NULL) return;

	Node * p=link.front;

	while(p!=NULL){
	if(p->data==x) break;
	else p=p->next;
	}

	if(p!=NULL){//找到节点  删除
	 
        if(p==link.front && p==link.rear){//只有一个节点 删除
		link.front=NULL;
		link.rear=NULL;
		free(p);
		} else if(p==link.front){//删除第一个节点
		
			link.front=p->next;
			(p->next)->prior=NULL;
			free(p);
		} else if(p==link.rear){//删除第最后个节点
			link.rear=p->prior;
            (p->prior)->next=NULL;
			free(p);
		}else {//普通删除
		Node * q=p->prior;
		q->next=p->next;
		(p->next)->prior=q;
		free(p);
		}
      
	}

}

void search(Link &link){

    if(link.rear==NULL) return;

	Node * p=link.front;

	while(p!=NULL){
	printf("%d--->",p->data);
	p=p->next;
	}
		printf("\n");
}


int main(int argc, char* argv[])
{

	Link link;
	inital(link);
	insert(link,1);
	insert(link,2);
	insert(link,3);			
	insert(link,4);	
	insert(link,5);	
	insert(link,6);
	insert(link,7);
	insert(link,8);
	insert(link,9);
	insert(link,10);
    search(link);
	remove(link,5);
		remove(link,4);
			remove(link,10);
     search(link);
	printf("Hello World!\n");
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值