编辑代码


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//创建一个双链表的数据结构
typedef struct __double_list
{
	char data[10] ;
	struct __double_list *prev ;
	struct __double_list *next ;
}DL ; 
 
//创建双向链表并插入一个节点 
DL *create_dl_node(char *data)
{
	DL *p = malloc(sizeof(DL));
	if(NULL == p)
	{
		printf("create dl node fair!\n");
		return NULL ;
	}
	//初始化数据
    memcpy(p->data, data, 10); 
	//p->data = data ;
	//初始化指针 
	p->next = NULL ;
	p->prev = NULL ;
    return p;
}
 
//双向链表的尾插 
void double_list_tail_insert(DL *header , DL *new)
{
	//取得当前节点的地址 
	DL *p = header ;
	//找到链表的尾节点 
	while(NULL != p->next)
	{
		//找不到接着找 
		p = p->next ;
	}
	//找到了尾节点,指向新节点的首地址 
	p->next = new ;
	//新节点的prev指针指向原来的尾节点的首地址。
	new->prev = p;
}
 
//双向链表的头插(也就是插在两个节点之间的插入方式)
void double_list_top_insert(DL *header , DL *new)
{
	//新节点的next指针指向原来的节点一的地址
	new->next = header->next ; 
	//判断当前节点的下一个节点的地址是否为空
	if(NULL != header->next) 
		header->next->prev = new ; //节点1的prev指针指向新节点的地址 
	header->next = new ;
	new->prev = header ;
}
 
//双向链表的正向遍历 
void double_list_for_each(DL *header)
{
	DL *p = header ;
	while(NULL != p->next)
	{
		p = p->next ;
		printf("%s\r\n",p->data);
	}
}
 
//双向链表的反向遍历 
void double_list_for_each_nx(DL *header)
{
	DL *p = header ;
	//先找到尾节点
	while(NULL != p->next)
	{
		p = p->next ;	
	} 
	//已经找到了尾节点,向前遍历,注意,遍历到头节点之前
	//限制条件: != 头结点 
	while(NULL != p->prev)
	{
		printf("%s\r\n",p->data);
		p = p->prev ;
	}
}
 
//双向链表节点的删除
int double_list_delete_node(DL *header , char *data)
{
	//取得当前节点 
	DL *p = header;
	//遍历所有的节点 
	while(NULL != p->next)
	{
		p = p->next ;
		//找到了对应要删除的数据了
		if(strcmp(p->data, data)==0)
		{
			//一样存在两种情况
			//(1)当前节点的下一个节点不为空
			if(p->next != NULL)
			{
				//那就把当前节点的prev节点指向要删除的这个节点的prev
				//因为当前的prev节点保存的是要删除的上一个节点的指针 
				p->next->prev = p->prev ;
				//还要指定它的next节点 
				p->prev->next = p->next ;
				free(p);
			}
			//(2)当前节点的下一个节点为空 
			else
			{
				//把 
				p->prev->next = NULL ;
				free(p); 
			}
			return 0 ;
		}
	}
	printf("\n没有找到对应要删除的节点,或者节点已经被删除!\n");
	return -1 ;	
} 
int List_Delete_FirstNode(DL *header)
{
  DL *p = header;
  p = p->next;/* 第一个节点 */
  p->next->prev = p->prev;/* 第二个节点的prev指向头节点 */
  p->prev->next =  p->next;/* 头节点的next指向第二个节点 */
  free(p);
}

int main(void)
{
	int i ;
    char zzz[10] = {0};
    char str[10][10];
    strcpy(str[0], "123");
    strcpy(str[1], "234");
    strcpy(str[2], "345");
    strcpy(str[3], "456");
    strcpy(str[4], "567");
    strcpy(str[5], "678");
    strcpy(str[6], "789");
    strcpy(str[7], "890");
    strcpy(str[8], "901");
    strcpy(str[9], "012");
	DL *header = create_dl_node(zzz);
	for(i = 0 ; i < 10 ; i++)
	{
		//双向链表的尾插 
		double_list_tail_insert(header,create_dl_node(str[i]));
		//双向链表的头插 
		//double_list_top_insert(header,create_dl_node(i));
	}
    double_list_for_each(header);
//    List_Delete_FirstNode(header);
    double_list_delete_node(header, str[7]);
    printf("\r\n");
    double_list_for_each(header);
//    List_Delete_FirstNode(header);
//    printf("\r\n");
//    double_list_for_each(header);
	//双向链表的正向遍历 
//	printf("双向链表的正向遍历:");
//	double_list_delete_node(header,5);
//	double_list_for_each(header);
//	double_list_delete_node(header,9);
//	double_list_delete_node(header,5);
//	putchar('\n');
//	printf("双向链表的反向遍历:");
//	double_list_for_each_nx(header);
	return 0 ;
}