刚编的链表程序**晒晒**
											 程序代码:
程序代码:/*带头结点的双向循环链表相关操作 结点采用尾部插入*/
#include <stdio.h>
#include <stdlib.h>
struct node
{
    int data;
    struct node *next;//后继
    struct node *prev;//前驱
};
struct node *temp;
//初始化链表
struct node * init_list(struct node *head)
{
    head = (struct node*) malloc (sizeof (struct node));
    if (NULL == head)
    {
        exit(-1);
    }
   
    head->next = head;
    head->prev = head;
   
    return head;
}
//添加结点
void add(struct node *next, struct node *prev, struct node *position)
{
    position->next = next;
    prev->next = position;
    position->prev = prev;
    next->prev = position;
}
//向链表中添加结点
void add_node(struct node *head, struct node *position)
{
    add(head->prev->next, head->prev, position);
}
//删除结点 返回被删的上一个结点
struct node * delet(struct node *next, struct node *prev)
{
    prev->next = next;
    next->prev = prev;
    return prev;
}
//从链表中删除某结点 与data数值相同的
void delet_node(struct node *head, int data)
{
    struct node *p;
    temp = head->next;
    while (temp != head)
    {
        if (temp->data == data)
        {
            p = delet(temp->next, temp->prev);
            free(temp);
            temp = p;
        }
       
        temp = temp->next;
    }
}
//修改链表中的结点 与data数值相同的
void chg_node(struct node *head, int data, int newValue)
{
    temp = head->next;
    while (temp != head)
    {
        if (temp->data == data)
        {
            temp->data = newValue;
        }
        temp = temp->next;
    }
}
//删除整个链表
void delet_list(struct node *head)
{
    temp = head->next;
   
    while (temp != head)
    {
        delet (temp->next, temp->prev);
        free(temp);
        temp = head->next;
    }
    free(head);
    head = NULL;
    printf("删除成功!\n");
}
//先序打印
void prev_print_list(struct node *head)
{
    temp = head->next;
    while (temp != head)
    {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");
}
//后序打印
void post_print_list(struct node *head)
{
    temp = head->prev;
    while (temp != head)
    {
        printf("%d ", temp->data);
        temp = temp->prev;
    }
    printf("\n");
}
void function()
{
    struct node *head = NULL;
    struct node *temp = NULL;
    int index = 10;
    printf("初始化链表\n");
    head = init_list(head);//初始化
    printf("先序打印双向循环链表:");
    prev_print_list(head);
    printf("后序打印双向循环链表:");
    post_print_list(head);
    printf("\n\n项链表中连续插入 %d 个元素\n", index);
    while (index)
    {
        temp = (struct node*) malloc (sizeof(struct node));
        temp->data = index--;
        add_node(head, temp);//向链表中添加结点
    }
    printf("先序打印双向循环链表:");
    prev_print_list(head);
    printf("后序打印双向循环链表:");
    post_print_list(head);
    printf("\n\n删除数据为 3 的结点\n");
    delet_node(head, 3);
    printf("先序打印双向循环链表:");
    prev_print_list(head);
    printf("后序打印双向循环链表:");
    post_print_list(head);
   
    printf("\n\n修改数据为 4 的结点 新值为 18\n");
    chg_node(head, 4, 18);
    printf("先序打印双向循环链表:");
    prev_print_list(head);
    printf("后序打印双向循环链表:");
    post_print_list(head);
   
    printf("\n\n删除整个链表\n");
    delet_list(head);
}
int main(void)
{
    function();
    return 0;
}										
					
	


 
											






 
	    

 
	


 
											
 
										
					
	
