关于双向循环链表基本操作

简单写了一下,留作纪念,欢迎指错----->

#include<stdio.h>
#include<stdlib.h>
typedef struct _node
{
    int val;
    struct _node *next;
    struct _node *prev;
}Node;
typedef struct _list
{
    Node *head;
    Node *tail;
    Node *sign_next;
    Node *sign_prev;
}List;
void Creat_list(List *list)
{
    int len=4;
    for(int i=0;i<len;++i) {
        Node *p = (Node *) malloc(sizeof(Node));
        p->val = i;
        if (!i) {
            list->head = p;
            list->tail = list->head;
            list->tail->next = list->tail->prev = list->tail;
        } else {
            list->tail->next = p;
            list->tail->next->prev = list->tail;
            list->tail = p;
        }
    }
    list->tail->next=list->head;
    }
void Printf_list(List*list)
{
    Node *p=list->tail;
    while(1)
    {
        printf("%d",p->val);
        if(p==list->head)
            break;
        p=p->prev;
    }
}
int Check_list(List*list)
{
    int n;
    printf("please input n");
    scanf("%d",&n);
    Node *p=list->tail;
    int count=0;
    while(1)
    {
           count++;
        if(n==count)
        {
                list->sign_prev=p;
                list->sign_next=p->next;
                break;
        }
        p=p->prev;
    }
    return n;
}
void Input_list(List*list)
{
    printf("Input list");
    int n=Check_list(list);
    Node *p=(Node*)malloc(sizeof(Node));
        p->val=9;
        p->next = list->sign_next;
        p->prev = list->sign_prev;
        list->sign_prev->next = p;
        list->sign_next->prev = p;
    if(n==1)
        list->tail=p;
    }
void Delete_list(List*list)
{
    printf("Delete list");
    int n=Check_list(list);
    Node *q=list->sign_prev->prev;
    q->next=list->sign_next;
    list->sign_next->prev=q;
    if(n==1)
        list->tail=list->sign_prev->prev;
    free(list->sign_prev);
}
void Printf_list_back(List *list)
{
    Node *p=list->head;
    while(1)
    {
        printf("%d",p->val);
        if(p==list->tail)
            break;
        p=p->next;
    }
}
void Free_list(List*list)
{
    Node *p=list->head;
    Node *q=NULL;
    while(1)
    {
        if(p==list->tail)
            break;
        q=p->next;
        free(p);
        p=q;


    }
}
int main(void)
{
    List list;
    list.head=list.tail=list.sign_next=list.sign_prev=NULL;
    Creat_list(&list);
    Input_list(&list);
    Delete_list(&list);
    printf("Printf_back_order_list");
    Printf_list(&list);
    printf("\n");
    printf("Printf_normal_order_list");
    Printf_list_back(&list);
    Free_list(&list);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值