//双链表--不带头结点
#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;
}
双链表不带头结点C语言源码详解
最新推荐文章于 2023-03-22 22:13:29 发布