双链表 尾插 按位置查找

1.c

#include"head.h"
/*
 * function:    创建双向链表头节点
 * @param [ in] 无参数
 * @param [out] 
 * @return      成功返回地址 失败返回NULL
 */
doublelink create_head()
{
doublelink l=(doublelink)malloc(sizeof(struct Node));
if(l==NULL)
	return NULL;
	l->len=0;
	l->next=NULL;
	l->prve=NULL;
	return l;
}
/*
 * function:    创建双向链表普通结点
 * @param [ in] 无参数
 * @param [out] 
 * @return      成功返回地址 失败返回NULL
 */
doublelink create_node()
{
	doublelink p=(doublelink)malloc(sizeof(struct Node));
	if(p==NULL)
	return NULL;
	strcpy(p->data,"");
	p->next=NULL;
	p->prve=NULL;
	return p;
}

/*
 * function:    双向链表头插
 * @param [ in] 头节点 插入的值
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
int insert_head(doublelink l,datatype e)
{
	//判断头节点是否存在
	if(l==NULL)
	{
		printf("插入失败\n");
		return -1;
	}
	//在头节点后插入新结点s
	doublelink s=create_node();
	if(s==NULL);
	return -1;
	//s的数据域
	strcpy(s->data,e);
	//s的指针域
	s->next=l->next;
	s->prve=l;
	if(l->next!=NULL)
	{
		l->next->prve=s;
	}
	l->next=s;
	l->len++;
}

/*
 * function:    尾插
 * @param [ in] 链表,插入的值
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */

int insert_rera(doublelink l,datatype e)
{	
	//判断头节点是否存在
	if(l==NULL)
	{
	printf("插入失败\n");
	return -1;
}
	//循环到最后一个结点
	doublelink p=l;
	while(p->next!=NULL)
{
	p=p->next;
}
//创建新结点
	doublelink q=create_node();
	if(q==NULL)
{
	return -1;
}
//s的数据域
	strcpy(q->data,e);
	//q的指针域
	p->next=q;
	q->prve=p;
	l->len++;
}

/*
 * function:    遍历
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void output(doublelink l)
{
	//判断头节点是否存在
	//判断链表是否为空
	if(l==NULL||l->len==0)
	{
		printf("遍历失败\n");
		return;
	}
	//遍历
	puts("正向遍历:");
	doublelink p=l;
while(p->next!=NULL)
{
	p=p->next;
	printf("%s\t",p->data);
}
puts("\n逆向遍历:");
while(p->prve!=NULL)
{
	printf("%s\t",p->data);
	p=p->prve;
}
puts("");
}

/*
 * function:  头删  
 * @param [ in] 链表
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
int delete_head(doublelink l)
{	//判断头节点是否存在
	//判断链表是否为空
	if(l==NULL||l->len==0)
{
	printf("删除失败\n");
	return -1;
}
//删除头节点的后继结点
doublelink q=l->next;
l->next=q->next;
if(q->next!=NULL)
{
	q->next->prve=l;
}
free(q);
q=NULL;
l->len--;
}

/*
 * function:    尾删
 * @param [ in] 链表
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */

int delete_rera(doublelink l)
{
	//判断头节点是否存在
	//判断链表是否为空
	if(l==NULL||l->len==0)
{
	printf("删除失败\n");
	return -1;
}
//删除尾结点
doublelink p=l;
while(p->next!=NULL)
{
	p=p->next;
}
p->prve->next=NULL;
free(p);
p=NULL;
l->len--;
return 0;
}

/*
 * function:    按位置插入
 * @param [ in] 链表 下标 元素
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
int insert_pos(doublelink l,int pos,datatype e)
{
	//判断头节点是否存在
	//判断链表是否为空
	//判断位置是否合法
	if(l==NULL||l->len==0||pos<0||pos>l->len)
	{
		printf("插入失败\n");
		return -1;
	}
	//找到下标所在位置
	doublelink p=l;
	int i=0;
	while(i!=pos)
	{
		p=p->next;
		i++;
	}
	doublelink s=create_node();
	strcpy(s->data,e);
	s->next=p->next;
	s->prve=p;
	if(p->next!=NULL)
	{
		p->next->prve=s;
		p->next=s;
	}
	
	l->len++;
	return 0;

}

main.c

#include"head.h"
int main(int argc, const char *argv[])
{
	doublelink l=create_head();
	int n;
	datatype e;
	printf("请输入数据元素的个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		printf("请输入插入的字符:");
		scanf("%s",e);
		insert_head(l,e);
		insert_rera(l,e);
	}
	output(l);
	delete_head(l);
	output(l);
	delete_rera(l);
	output(l);
	
	int pos;
	printf("请输入要插入的位置:");
	scanf("%d",&pos);
	printf("要插入的值:");
	scanf("%s",e);
	insert_pos(l,pos,e);
	output(l);

	return 0;
}

head.h

#ifndef __HEAD_H__
#define __HEAD_H__


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef char datatype[20];

//定义双向链表结构体
typedef struct Node
{
	union
	{
		int len;
		datatype data;
	};
	struct Node *next;
	struct Node *prve;

}*doublelink;

doublelink create_head();

doublelink create_node();

int insert_head(doublelink l,datatype e);

int insert_rera(doublelink l,datatype e);

void output(doublelink l);

int delete_head(doublelink l);

int delete_rera(doublelink l);

int insert_pos(doublelink l,int pos,datatype e);
#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双向循环链表是一种链表结构,它的每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。与单向链表不同的是,双向循环链表的头节点的前一个节点指向节点,节点的后一个节点指向头节点,形成一个循环。以下是双向循环链表的基本操作: 1. 头文件 ```c #include <stdio.h> #include <stdlib.h> ``` 2. 双向链表的基本结构 ```c typedef struct node { int data; struct node *prev; // 指向前一个节点 struct node *next; // 指向后一个节点 } Node, *DoubleLinkedList; ``` 3. 初始化双链表 ```c DoubleLinkedList init() { DoubleLinkedList head = (DoubleLinkedList)malloc(sizeof(Node)); head->prev = head; head->next = head; return head; } ``` 4. 双链表判空 ```c int isEmpty(DoubleLinkedList head) { return head->next == head; } ``` 5. 双链表 ```c void insertTail(DoubleLinkedList head, int data) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->prev = head->prev; newNode->next = head; head->prev->next = newNode; head->prev = newNode; } ``` 6. 双链表 ```c void insertHead(DoubleLinkedList head, int data) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->prev = head; newNode->next = head->next; head->next->prev = newNode; head->next = newNode; } ``` 7. 创建一个新节点 ```c Node *createNode(int data) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->prev = NULL; newNode->next = NULL; return newNode; } ``` 8. 在某一节点前入一个新节点 ```c void insertBefore(DoubleLinkedList head, Node *node, int data) { Node *newNode = createNode(data); newNode->prev = node->prev; newNode->next = node; node->prev->next = newNode; node->prev = newNode; } ``` 9. 删除当前节点 ```c void deleteNode(DoubleLinkedList head, Node *node) { node->prev->next = node->next; node->next->prev = node->prev; free(node); } ``` 10. 双链表头删 ```c void deleteHead(DoubleLinkedList head) { if (isEmpty(head)) { printf("List is empty.\n"); return; } deleteNode(head, head->next); } ``` 11. 双链表删 ```c void deleteTail(DoubleLinkedList head) { if (isEmpty(head)) { printf("List is empty.\n"); return; } deleteNode(head, head->prev); } ``` 12. 双链表打印 ```c void printList(DoubleLinkedList head) { if (isEmpty(head)) { printf("List is empty.\n"); return; } Node *p = head->next; while (p != head) { printf("%d ", p->data); p = p->next; } printf("\n"); } ``` 13. 查找 ```c Node *search(DoubleLinkedList head, int data) { Node *p = head->next; while (p != head) { if (p->data == data) { return p; } p = p->next; } return NULL; } ``` 14. 销毁双链表 ```c void destroy(DoubleLinkedList head) { Node *p = head->next; while (p != head) { Node *temp = p; p = p->next; free(temp); } free(head); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值