03-双向循环链表

dlist.h

#ifndef __DLIST_H__
#define __DLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> 
        
typedef struct NODE{
        int data;
        struct NODE*front;
        struct NODE*next;
}dlistnode;

dlistnode* dlist_create(void);
void dlist_show(dlistnode*DH);
bool dlist_insert(dlistnode*DH,int pos,int value);
bool dlist_delete(dlistnode*DH,int value);
bool dlist_change(dlistnode*DH,int pos,int value);
dlistnode* dlist_search(dlistnode*DH,int value);
        
#endif  

dlist.c

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "dlist.h"


dlistnode* dlist_create()
{
	dlistnode *DH = NULL;
	DH = (dlistnode*)malloc(sizeof(dlistnode));

	DH->data = 0;
	DH->front = DH;
	DH->next = DH; 
	return DH;
}

void dlist_show(dlistnode*DH)
{
	dlistnode *P=DH;
	
	
	while(P->next!=DH)
	{
		printf("%d\t",P->data);
		P = P->next;
	}
	printf("%d\t",P->data);
}

//双向链表插入一个节点包含两个地址域,每个地址域连接2条线,一共连接4条线
bool dlist_insert_head(dlistnode*DH,int value)
{
	dlistnode*P =NULL;
	P = (dlistnode*)malloc(sizeof(dlistnode));
	
	P->data = value;
	P->front = DH;
	P->next = DH->next;
	DH->next->front = P;
	DH->next = P;

	return true;
}


bool dlist_delete(dlistnode*DH,int value)
{
	dlistnode*Q = DH->next;
	while(Q->data!=value)
	{
		printf("#");
		Q = Q->next;
	}
	Q->next->front = Q->front; //注意
	Q->front->next = Q->next;  //注意
	free(Q);
	return true;
}
bool dlist_change(dlistnode*DH,int pos,int value)
{
	dlistnode*P =DH;
	int i=0;
	for(i;i<pos;i++)
	{
		P = P->next;
	}
	P->data = value;
	return true;
}

dlistnode* dlist_search(dlistnode*DH,int value)
{
	dlistnode*P=DH;
	while(P->data!=value)
	{
		P = P->next;
	}
	return P;
}

dlist_text.c

#include "dlist.h"

void main(int argc,char*argv[])
{
	dlistnode*DH = NULL;
	dlistnode*P=NULL;
	DH = dlist_create();
	if(DH!=NULL)
	{
		printf("\n创建成功\n");
	}
	else
	{
		printf("\n创建失败\n");
	}
	printf("\n双向循环链表:增加10,20,30,40,50\n");
	dlist_insert_head(DH,10);
	dlist_insert_head(DH,20);
	dlist_insert_head(DH,30);
	dlist_insert_head(DH,40);
	dlist_insert_head(DH,50);
	dlist_show(DH);


	printf("\n双向循环链表:修改为100,200,300,400,500\n");
	dlist_change(DH,1,100);
	dlist_change(DH,2,200);
	dlist_change(DH,3,300);
	dlist_change(DH,4,400);
	dlist_change(DH,5,500);
	dlist_show(DH);

	printf("\n双向循环链表:查询200\n");
	P = dlist_search(DH,200);
	printf("查询到data == %d\n",P->data);
	dlist_show(DH);


	printf("\n双向循环链表:删除100,200,300,400\n");
	dlist_delete(DH,100);
	dlist_delete(DH,200);
	dlist_delete(DH,300);
	dlist_delete(DH,400);
	dlist_show(DH);
}


Makefile

VPATH=/home/yqj/双向循环链表/

dlist_text:dlist.o dlist_text.c
	gcc -g dlist.o dlist_text.c -o dlist_text
listnode.o:dlist.c dlist.h
	gcc -g -c dlist.c -o dlist.o

.PHONY:clean
clean:
	rm -rf dlist.o dlist_text 

结果

root@ubuntu:/home/yqj/desktop/双向循环链表# ./dlist_text 

创建成功

双向循环链表:增加1020304050
0	50	40	30	20	10	
双向循环链表:修改为100200300400500
0	100	200	300	400	500	
双向循环链表:查询200
查询到data == 200
0	100	200	300	400	500	
双向循环链表:删除100,200,300,400
0	500	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值