//
// 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);
}
数据结构--线性表(双链表C语言实现)
猜你喜欢
转载自blog.csdn.net/karmacode/article/details/80178850
今日推荐
周排行