数据结构--线性表(双链表C语言实现)

//
//  main.cpp
//  DoubLinkList
//
//  Created by 娄坤 on 2018/4/27.
//  Copyright © 2018年 娄坤. All rights reserved.
//

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//双链表
typedef int status;
typedef int elemtype;

typedef struct node{
    int data;//数据存放域
    struct node *prior;//前驱指针存放域
    struct node *next;//后继指针存放域

}DLnode, *DLinkList;

status initDlinkList(DLinkList *head,DLinkList * tail){
    (*head) = (DLinkList)malloc(sizeof(DLnode));
    (*tail) = (DLinkList)malloc(sizeof(DLnode));
    if(!(*head) || !(*tail)){
        return ERROR;
    }

    (*head)->prior = NULL;
    (*tail)->next = NULL;
    //链表为空是让头指向尾
    (*head)->next = (*tail);
    (*tail)->prior = (*head);
    return OK;
}
//判断链表是否为空
status emptyLinkList(DLinkList head,DLinkList tail){
    if(head->next == tail){
        return TRUE;
    } else{
        return FALSE;
    }
}


//尾插法建立双向链表
status createDLinkListtail(DLinkList head,DLinkList tail,elemtype data){
    DLinkList p;
    p = (DLinkList)malloc(sizeof(DLnode));
    if(!p){
        return ERROR;
    }
    p->data = data;//为节点添加数值

    p->next = NULL;
    p->prior = NULL;

    tail->prior->next = p;
    p->prior = tail->prior;
    p->next = tail;
    tail->prior = p;
    return OK;
}

//头插法建立双向链表

status createDLinkListhead(DLinkList head,DLinkList tail,elemtype data){
    DLinkList pmove = head,p;
    p = (DLinkList)malloc(sizeof(DLnode));
    if(!p){
        return ERROR ;
    }else {
        p->data = data;
        p->prior = pmove;
        p->next = pmove->next;
        pmove->next->prior = p;
        pmove->next = p;
        return OK;
    }
}
//删除链表中值为n的元素,
status deleateelem(DLinkList head,DLinkList tail){
    int n,flag = 0;
    printf("请输入要删除的元素的值:\n");
    scanf("%d",&n);
    DLinkList p = head->next;
    while(p!=NULL){
        if(p->data == n){
            flag = 1;
            break;
        }
        p = p->next;
    }
    if(p==NULL || flag == 0){
        printf("输入数据非法/数据不存在\n");
        return ERROR;
    } else {
        p->next->prior = p->prior;
        p->prior->next = p->next;
        free(p);
    }
    return OK;
}






//正序打印链表
void printtraverlist(DLinkList head,DLinkList tail){
    DLinkList pmove = head->next;
    while(pmove !=tail){
        printf("%d ",pmove->data);
        pmove = pmove->next;
    }
    printf("\n");
}

//逆序打印链表
void printinverse(DLinkList head,DLinkList tail){
    DLinkList ptail = tail->prior;
    while(ptail != head){
        printf("%d ",ptail->data);
        ptail = ptail->prior;

    }
    printf("\n");
}


int main(){
    DLinkList head,tail; //头指针和尾指针
    int i,n,data;
    initDlinkList(&head,&tail);//初始化双向链表
    printf("请输入要输入的元素个数:\n");
    scanf("%d",&n);
    if(emptyLinkList(head, tail)){
        printf("链表为空\n");

    } else {
        printf("链表不为空\n");
    }
    printf("使用尾插法创建链表\n");
    for(i = 0;i < n;i++){
        printf("请输入元素%d的数字:\n",i+1);
        scanf("%d",&data);

        //选择尾插法创建双向链表
        createDLinkListtail(head, tail, data);
    }
    /*
    printf("使用头插法创建双向链表:\n");
    for(i = 0;i < n;i++){
        printf("请输入元素%d的数字:\n",i+1);
        scanf("%d",&data);
        //使用头插法创建双向链表
        createDLinkListhead(head, tail, data);
    }
     */
    deleateelem(head, tail);
    //正序打印链表
    printf("正序打印链表如下:\n");
    printtraverlist(head,tail);

    //逆序打印链表
    printf("逆序打印链表如下:\n");
    printinverse(head, tail);




}

猜你喜欢

转载自blog.csdn.net/karmacode/article/details/80178850