数据结构---双向链表的基本操作

  1. 头插法
  2. 遍历链表
  3. 尾插法
  4. 头删法
  5. 尾删法
  6. 按位置插入数据
  7. 按位置删除数据

dooublelinklist.c

cs 复制代码
#include <stdio.h>
#include <stdlib.h>
#include "./doublelinklist.h"
 
doublelinklist* create_doublelinklist(void)
{
	doublelinklist* head = (doublelinklist*)malloc(sizeof(doublelinklist));	
	if(NULL == head)
	{
		printf("头结点申请失败!\n");
		return NULL;
	}
	head->text.len = 0;
	head->next = NULL;
	head->prev = NULL;
 
	return head;
}

//头插法
int  insertHead_doublelinlist(doublelinklist *head,dataType num)
{
	//创建一个新结点
	doublelinklist* temp = (doublelinklist*)malloc(sizeof(doublelinklist));
	if(NULL == temp)
	{
		printf("创建失败!\n");
		return 0;
	}
	temp->text.data = num;
	temp->next = NULL;
	temp->prev = NULL;

	if(NULL == temp)
	{
		printf("创建失败!\n");
		return 0;
	}
	if(1 == isEmpty_doublelinlist(head))
	{
		temp->next = head->next;
		head->next = temp;
	}
	else
	{
		//头插法插入数据

		temp->next = head->next; 
		head->next = temp;

		head->next->prev = temp;
		temp->prev = head;

	}
	return 0;
}
 
//遍历链表
 
void show_doublelinklist(doublelinklist* head)
{
	doublelinklist *p = head;
	while(p->next != NULL)
	{
		p = p->next;
		printf("%d ",p->text.data);
	}
	printf("\n");
	//更新头结点中记录的链表长度
	head->text.len++;
 
	return;
}

//尾插法
int insertTail_doublelinlist(doublelinklist* head,dataType num)
{
	doublelinklist* temp = (doublelinklist*)malloc(sizeof(doublelinklist));
	if(NULL == temp)
	{
		printf("创建失败!\n");
		return 0;
	}
	//初始化新结点
	temp->text.data = num;
	temp->next = NULL;
	temp->prev = NULL;

	doublelinklist* p = head;
	while(p->next != NULL)
	{
		p = p->next;
	}
	
	temp->prev = p;
	p->next = temp;
	


	head->text.len++;
	return 0;
}
//判空
int isEmpty_doublelinlist(doublelinklist* head)
{
	return head->next == NULL?1:0;
}

//按位置插入
void insert_location_doublelinlist(doublelinklist*head,dataType index,dataType num)
{
	if(index<1 || index >head->text.len+1)
	{
		printf("位置非法!");
		return;
	}
	int i;
	doublelinklist* temp=head;
	doublelinklist* p = (doublelinklist*)malloc(sizeof(doublelinklist));
	if(NULL == p)
	{
		printf("插入失败!\n");
		return ;
	}
 
 
	//初始化新结点
	
	p->text.data = num;
	p->next = NULL;
	p->prev = NULL;
 
	for(i=0;i<index-1;i++)
	{
		temp = temp->next;
	}
	if(temp->next == NULL)
	{
		p->next = temp->next;
		temp->next = p;
		p->prev = temp;
	}else
	{
		p->next = temp->next;
		p->prev = temp;
		temp->next->prev = p;
		temp->next = p;
	}
	head->text.len++;

	return;

}
//头删
dataType delHead_doublelinlist(doublelinklist* head)
{
	if(isEmpty_doublelinlist(head))
	{
		printf("链表为空!");
		return (dataType)0;
	}

	doublelinklist* temp = head->next;
	head->next = head->next->next;
	temp->next->prev = head;

	dataType num = temp->text.data;
	free(temp);
	temp = NULL;

	head->text.len--;
	return num;
}

//尾删
dataType delTail_doublelinlist(doublelinklist* head)
{
	if(isEmpty_doublelinlist(head))
	{
		printf("链表为空!");
		return (dataType)0;
	}
	doublelinklist* p = head;
	doublelinklist* temp;
	while(p->next != NULL)   //p->next->next != NULL
	{
		temp = p;
		p = p->next;
	}
	temp->next=temp->next->next;
	free(p);    //free(temp->next)
	p = NULL;   //temp->next = NULL

	head->text.len--;
	return 0;

}


//按位置删除
void del_location_doublelinlist(doublelinklist* head,dataType index)
{
	if(isEmpty_doublelinlist(head))
	{
		printf("链表为空!");
		return;
	}
	doublelinklist* temp = head;

	for(int i=0;i<index-1;i++)
	{
		temp = temp->next;
	}
	doublelinklist* p = temp->next;
	temp->next = temp->next->next;
	p->prev->prev = temp;

	free(p);
	p = NULL;

	head->text.len--;
	return;

}

doublelinklist.h

cs 复制代码
#ifndef __DOUBLELINKLIDT_H__
#define __DOUBLELINKLIDT_H__
 
typedef int dataType;
 
union msg{
 
	dataType data;
	int len;
};
typedef struct node
{
	struct node* next;
	struct node* prev;
	union msg text; 
}doublelinklist;

doublelinklist* create_doublelinklist(void);
int  insertHead_doublelinlist(doublelinklist *head,dataType num);
void show_doublelinklist(doublelinklist* head);
int insertTail_doublelinlist(doublelinklist* head,dataType num);
int isEmpty_doublelinlist(doublelinklist* head);
void insert_location_doublelinlist(doublelinklist*head,dataType index,dataType num);
dataType delHead_doublelinlist(doublelinklist* head);
dataType delTail_doublelinlist(doublelinklist* head);
void del_location_doublelinlist(doublelinklist* head,dataType index);



#endif

doublemain.c

cs 复制代码
#include <stdio.h>
#include "./doublelinklist.h"
int main(int argc, const char *argv[])
{
	doublelinklist* head =  create_doublelinklist();
	insertHead_doublelinlist(head,11);
	insertHead_doublelinlist(head,22);
	show_doublelinklist(head);

	insertTail_doublelinlist(head,33);
	insertTail_doublelinlist(head,44);
	show_doublelinklist(head);
	
	insert_location_doublelinlist(head,2,222);
	show_doublelinklist(head);
	
	delHead_doublelinlist(head);
	show_doublelinklist(head);

	delTail_doublelinlist(head);
	show_doublelinklist(head);

	del_location_doublelinlist(head,2);
	show_doublelinklist(head);



	return 0; 
}
相关推荐
liu****2 小时前
10.queue的模拟实现
开发语言·数据结构·c++·算法
shinelord明3 小时前
【大数据技术实战】Kafka 认证机制全解析
大数据·数据结构·分布式·架构·kafka
小龙报3 小时前
《彻底理解C语言指针全攻略(6)-- qsort、sizeof和strlen》
c语言·开发语言·职场和发展·创业创新·学习方法·业界资讯·visual studio
让我们一起加油好吗3 小时前
【基础算法】01BFS
数据结构·c++·算法·bfs·01bfs
草莓工作室3 小时前
数据结构3:线性表2-顺序存储的线性表
数据结构·windows
1白天的黑夜14 小时前
递归-24.两两交换链表中的节点-力扣(LeetCode)
数据结构·c++·leetcode·链表·递归
1白天的黑夜14 小时前
递归-206.反转链表-力扣(LeetCode)
数据结构·c++·leetcode·链表·递归
靠近彗星4 小时前
3.1 栈
数据结构·算法
sulikey5 小时前
一文彻底理解:如何判断单链表是否成环(含原理推导与环入口推算)
c++·算法·leetcode·链表·floyd·快慢指针·floyd判圈算法
孤廖6 小时前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法