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);
}
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
创建成功
双向循环链表:增加10,20,30,40,50
0 50 40 30 20 10
双向循环链表:修改为100,200,300,400,500
0 100 200 300 400 500
双向循环链表:查询200
查询到data == 200
0 100 200 300 400 500
双向循环链表:删除100,200,300,400
0 500