您的位置:首页 > 其它

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

2018-02-11 02:37 477 查看
简单写了一下,留作纪念,欢迎指错----->
#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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: