双链表不带头结点C语言源码详解

//双链表--不带头结点 
#include <stdio.h>
#include <stdlib.h>
typedef struct DNode{
	int data;
	struct DNode *prior;
	struct DNode *next;
}DNode,*DinkList;

//初始化双链表 
DinkList initList(DinkList list){
	list = NULL;
	return list; 
}

//第一个位置插入数据
DinkList insertFirst(DinkList list,int index,int data){
if(index == 1){
	DNode *newNode = (DNode *)malloc(sizeof(DNode));	
	(*newNode).next = list;
	(*newNode).prior = NULL;
	(*list).prior = newNode;
	list = newNode;
	(*newNode).data = data;
	return list;
	}
return NULL;
 }
//插入数据(不包括第一个位置)
int insertList(DinkList list,int index,int data){
	
	DNode *tmp=list;
	int j=1;
	
	if(list==NULL){
		return 0;
	}
	
	if(index<2){
		return 0;
	} 
	
	/*
		在index位置插入,需要找到第index-1才可以
		当然,直接循环找到index个结点也可以
		因为是双链表 
	*/
	while(tmp!=NULL&&j<index-1){
		
		tmp=(*tmp).next;
		
		j++;
	}
	
	if(tmp==NULL){
		return 0;
	}

	DNode *newNode=(DNode *)malloc(sizeof(DNode));
	if(newNode==NULL){
		return 0;
	}
	
	(*newNode).next=(*tmp).next;
	if((*tmp).next!=NULL){
		(*tmp).next->prior=newNode;
	}
	(*newNode).prior=tmp;
	(*tmp).next=newNode;
	(*newNode).data=data;
	
	return 1;
}
//指定结点后面插入数据
int insertNextNode(DNode *p,int data){
	if(p==NULL){
		return 0;
	}
	
	DNode *newNode=(DNode *)malloc(sizeof(DNode));
	if(newNode==NULL){
		return 0;
	}
	(*newNode).next = (*p).next;
	if((*p).next != NULL){
		(*p).next->prior = newNode;
	}
	(*p).next=newNode;
	(*newNode).prior=p;
	(*newNode).data=data;
	return 1;
	
}

//向指定结点前面插入数据 
int insertPriorNode(DNode *p, int data){
		if(p==NULL){
		return 0;
	}
	
	//找到前一个结点
	DNode *tmp=(*p).prior;
	if(tmp!=NULL){
		DNode *newNode=(DNode *)malloc(sizeof(DNode));
		if(newNode==NULL){
			return 0;
		}
	
		(*newNode).prior=tmp;
		(*newNode).next=p;
		(*p).prior=newNode;
		(*tmp).next=newNode;
		(*newNode).data=data;
	return 1;
}
}
//删除双链表第一个位置结点 
DinkList deleteFirst(DinkList list,int index){
	if(index == 1){
		DNode* tmp = list;
	
		if(tmp!=NULL){
			list = (*tmp).next;
			if((*tmp).next!=NULL){
				(*tmp).next->prior =000;
			}
			free(tmp);
			return list;
		}
		return NULL;
	}
	return NULL;
}

//删除双链表的指定位置的数据
int deleteList(DinkList list,int index){
	DNode* tmp=list;
	
	if(list==NULL){
		return 0;
	}
	
	int j=1;
	
	if(index<2){
		return 0;
	}

	while(tmp!=NULL&&j<index-1){
		
		tmp=(*tmp).next;
		
		j++;
	}
	
	if(tmp==NULL){
		return 0;
	}
	
	DNode *p=(*tmp).next;
	if(p==NULL){
		return 0;
	} 
	
	(*tmp).next=(*p).next;
	if((*p).next!=NULL){
		(*p).next->prior=tmp;	
	}
//	*data=(*p).data;
	
	free(p);
	
	return 1;
}

//删除指定结点p
int deleteNode(DNode *p){
		if(p==NULL){
		return 0;
	}
	
	DNode *tmp=(*p).prior;
	if(tmp!=NULL){
		(*tmp).next=(*p).next;
		if((*p).next!=NULL){
			(*p).next->prior=tmp;	
		}
		free(p);
		return 1;
	}
	
	return 1;	
}


//按位查找
DNode* getElementByIndex(DinkList list,int index){
	DNode *tmp = list;
	int j = 1;
	while(tmp!=NULL&&j<index){
		tmp = (*tmp).next;
		j++;
	}
	printf("\n\n按值查找2处位置的的结点:\n%d",(*tmp).data);
	return tmp;
}

//按值查找
DNode* getElementByData(DinkList list,int data){
		DNode *tmp=list;
	int j = 1;
	while(tmp!=NULL&&(*tmp).data!=data){
		tmp=(*tmp).next;
		j++;
	}
	printf("\n\n按值查找数据为4的结点:\n%d",j);
	return tmp;
}

//求表的长度 
int getLength(DinkList list){
	
	if(list==NULL){
		return 0; 
	} 

	int length=1;
	DNode *tmp=list;
	while((*tmp).next!=NULL){
		tmp=(*tmp).next;
		length++;
	}

	return length;
	
}

//新建一个链表:头插法
DinkList constructLinkListOne(DinkList list){
	int i = 1;
	printf("\n\n建链表(头插法):\n");
	for(;i<5;i++){
	list = insertFirst(list,1,i+1);
		printf("%d,",(*list).data);
	} 
	return list;
}

//新建一个链表:尾插法 
DinkList constructLinkListTwo(DinkList list){
	
	int i=1;
	int j=1;  
	printf("\n\n建链表(尾插法):\n");
	for(;i<5;i++){
		insertList(list,j+1,i+1);
		j++;
	}
//	bianli(list);
	return list;
}
//遍历
void bianli(DinkList list){
	DNode *tmp = list; 
	while(tmp!=NULL){
	printf("%d,",(*tmp).data);
	tmp = (*tmp).next;					
	}
	printf("\n");
} 

int main(){
	int length=0;
	int i=0;
	DinkList list;
	list=initList(list);
	DNode *newNode=(DNode *)malloc(sizeof(DNode));
	(*newNode).next=list;
	list=newNode;
	(*newNode).data=1; 
 	list=constructLinkListOne(list);
//	list=constructLinkListTwo(list);
	length=getLength(list);
	printf("\n\n表长为:\n%d",length);
	printf("\n\n插数据(第一个位置)(指定位置):\n");
	list=insertFirst(list,1,999);
	bianli(list);
	printf("\n\n插数据(指定位置)(2,888):\n");
	insertList(list,2,888);
	bianli(list);
	printf("\n\n插数据(指定结点后):\n");
	DNode *tmp = list;
	for(;i<3;i++){
		tmp = (*tmp).next;
	}
	insertNextNode((*tmp).next,777);
	bianli(list);
	printf("\n\n插数据(指定结点前(不包括第一个结点)):\n");
	insertPriorNode((*tmp).next, 666);
	bianli(list);
	printf("\n\n删单链表的第一个位置:\n");
	list=deleteFirst(list,1);
	bianli(list);
	printf("\n\n删单链表(除第一个位置)的数据(2):\n");
	deleteList(list,2);
	bianli(list);
	printf("\n\n删指定结点:\n");
	deleteNode((*tmp).next);
	bianli(list);
	getElementByIndex(list,2);
	getElementByData(list,4);
	
	return 0;
}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梖梖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值