240417

双向链表的功能实现

头插

void insert_head(node_p H,datatype data){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
		node_p new=create_node(data);
 
	if(H->data==0){
		node_p new=create_node(data);
		new->next=H->next;
		new->prior=H;
		H->next=new;
		H->data++;		
	}else{
		node_p new=create_node(data);
		new->next=H->next;
		new->prior=H;
		H->next->prior=new;
		H->next=new;
		H->data++;
	}
}

头删

void Delete_head(node_p H){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
	if(empty_double(H)){
		printf("链表为空,不能删除\n");
		return;
	}
	if(H->data==1){
		node_p del=H->next;
		H->next=del->next;
		free(del);
		H->data--;
	}else{
		node_p del=H->next;
		H->next=del->next;
		del->next->prior=H;
		H->data--;
	}	
}

尾插

void Insert_tail(node_p H,datatype data){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
	node_p p=H;
	while(p->next){
		p=p->next;
	}
	node_p new=create_node(data);
	new->prior=p;
	new->next=p->next;
	p->next=new;
	H->data++;
}

尾删

void Delete_tail(node_p H){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
	if(empty_double(H)){
		printf("链表为空,不能删除\n");
		return;
	}
	node_p p=H->next;
	node_p q=H;
	while(p->next){
		p=p->next;
		q=q->next;
	}
	node_p del=p;
	q->next=del->next;
	free(del);
	H->data--;
}

按位置插

void insert_index(node_p H,datatype data,datatype index){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
	node_p p=H;
	for(int i=0;i<index-1;i++){
		p=p->next;	
	}
	node_p new=create_node(data);
	new->next=p->next;
	new->prior=p;
	p->next->prior=new;
	p->next=new;
	H->data++;
}

按位置删

void Delete_index(node_p H,datatype index){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
	if(empty_double(H)){
		printf("链表为空,不能删除\n");
		return;
	}
	node_p p=H;
	for(int i=0;i<index-1;i++){
		p=p->next;
	}	
	node_p del=p->next;
	if(H->data==1){
		p->next=del->next;
		free(del);
		H->data--;
	}else{
		del->next->prior=p;
		p->next=del->next;
		free(del);
		H->data--;
	}
}
双向链表源码

double_list.c

#include "double_list.h"
node_p create_list(){
	node_p H=(node_p)malloc(sizeof(node));
	if(H==NULL){
		printf("空间申请失败\n");
		return NULL;
	}
	H->data=0;
	H->prior=NULL;
	H->next=NULL;
	return H;
}
node_p create_node(datatype data){
	node_p new=(node_p)malloc(sizeof(node));
	if(new==NULL){
		printf("空间申请失败\n");
		return NULL;
	}
	new->data=data;
	return new;
}
int empty_double(node_p H){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
	return H->next==NULL?1:0;
}
void insert_head(node_p H,datatype data){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
		node_p new=create_node(data);
 
	if(H->data==0){
		node_p new=create_node(data);
		new->next=H->next;
		new->prior=H;
		H->next=new;
		H->data++;		
	}else{
		node_p new=create_node(data);
		new->next=H->next;
		new->prior=H;
		H->next->prior=new;
		H->next=new;
		H->data++;
	}
}
void show_double(node_p H){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
	if(empty_double(H)){
		printf("链表为空,不能输出\n");
		return;
	}
	node_p p=H;
	while(p->next){
		p=p->next;
		printf("%-4d",p->data);
	}
	putchar(10);
 
}
void Delete_head(node_p H){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
	if(empty_double(H)){
		printf("链表为空,不能删除\n");
		return;
	}
	if(H->data==1){
		node_p del=H->next;
		H->next=del->next;
		free(del);
		H->data--;
	}else{
		node_p del=H->next;
		H->next=del->next;
		del->next->prior=H;
		H->data--;
	}	
}
void Insert_tail(node_p H,datatype data){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
	node_p p=H;
	while(p->next){
		p=p->next;
	}
	node_p new=create_node(data);
	new->prior=p;
	new->next=p->next;
	p->next=new;
	H->data++;
}
void Delete_tail(node_p H){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
	if(empty_double(H)){
		printf("链表为空,不能删除\n");
		return;
	}
	node_p p=H->next;
	node_p q=H;
	while(p->next){
		p=p->next;
		q=q->next;
	}
	node_p del=p;
	q->next=del->next;
	free(del);
	H->data--;
}
void insert_index(node_p H,datatype data,datatype index){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
	node_p p=H;
	for(int i=0;i<index-1;i++){
		p=p->next;	
	}
	node_p new=create_node(data);
	new->next=p->next;
	new->prior=p;
	p->next->prior=new;
	p->next=new;
	H->data++;
}
void Delete_index(node_p H,datatype index){
	if(H==NULL){
		printf("入参为空\n");
		return -1;
	}
	if(empty_double(H)){
		printf("链表为空,不能删除\n");
		return;
	}
	node_p p=H;
	for(int i=0;i<index-1;i++){
		p=p->next;
	}	
	node_p del=p->next;
	if(H->data==1){
		p->next=del->next;
		free(del);
		H->data--;
	}else{
		del->next->prior=p;
		p->next=del->next;
		free(del);
		H->data--;
	}
}

main.c

#include "double_list.h"
int main(){
	node_p H=create_list();
	insert_head(H,155);
	insert_head(H,14);
	insert_head(H,13);
	insert_head(H,12);
	insert_head(H,11);
 
	show_double(H);
 
	Delete_head(H);
	Insert_tail(H,16);
	Delete_tail(H);
 
	
	insert_index(H,66,2);
	insert_index(H,65,3);
	insert_index(H,64,1);
	show_double(H);
 
	Delete_index(H,4);
	show_double(H);
 
	return 0;
}

double_list.h

#ifndef __DOUBLE_LIST_H__
#define __DOUBLE_LIST_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node{
	datatype data;
	struct node* prior; 
	struct node* next;
}node,*node_p;
 
node_p create_list();
node_p create_node(datatype data);
int empty_double(node_p H);
void insert_head(node_p H,datatype data);
void show_double(node_p H);
void Delete_head(node_p H);
void Insert_tail(node_p H,datatype data);
void dele_tail(node_p H);
void insert_index(node_p H,datatype data,datatype index);
void Delete_index(node_p H,datatype index);
 
#endif
链表逆置
void reverse_list(node_p H){
	if(H==NULL){
		printf("入参为空\n");
		return;
	}
	if(empty_link(H)){
		printf("链表为空,无法反转\n");
		return;
	}
 
	int count=0;
 
	node_p p=H->next;
	node_p q=H;
	while(p->next){//查找到最后一个元素
		p=p->next;//p指向最后一个元素
		q=q->next;//q指向倒数第二个元素,用于指空
	}
 
	
	node_p del=p;//准备删除
	node_p new=create_node(p->data);//创建一个新的节点加入到头结点后面,值为p的值
	new->next=H->next;//将新创建的节点头插
	H->next=new;
	q->next=NULL;//倒数第二个节点的next指空
	free(del);//释放del指向的最后一个节点
	//以上代码完成了将最后一个元素移动至头结点后
	//因为后面的代码不需要和头结点进行交互所以
	//需要分段
 
	node_p new1;
	for(int i=0;i<H->data-2;i++){
		if(i==0){
			new1=new;
		}
		node_p p=new1->next;
		node_p q=new1;
		node_p count=new1;
 
		while(p->next){//查找到最后一个元素
			p=p->next;
			q=q->next;
		}
 
 
		node_p del=p;
		new1=create_node(p->data);
		new1->next=count->next;
		count->next=new1;
		q->next=NULL;
		free(del);
 
 
	}
 
	/*node_p p = H->next->next;
	  H->next->next = NULL;  //给第一个结点的指针域赋值为NULL,变成最后一个结点
	  node_p q;     //暂时是一个野指针
	  while(p)
	  {
	  q = p->next;   //在头插之前保留下一个要头插结点的首地址
	  p->next = H->next; //头插
	  H->next = p;
	  p = q;  //让p指向下一个要头插的结点
	  }
	  */
 
 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值