码迷,mamicode.com
首页 > 编程语言 > 详细

双向链表的基本操作 C语言

时间:2018-01-17 00:40:58      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:一个   next   插入   std   turn   col   scanf   创建   post   

#include<stdio.h>
#include<stdlib.h>
typedef struct node* DNode;
struct node {
    int data;
    DNode prior; //前面数据地址
    DNode next;  //后面数据地址
}; 
//创建双向链表
void CreatNode(DNode *head) {
    DNode s;  //新节点指针
    char e;
    (*head) = (DNode)malloc(sizeof(struct node));//头结点
    (*head)->prior = (*head);  //初始头结点的前驱和后驱都指向自己
    (*head)->next = (*head);
    printf("输入数据\n");
    scanf("%c", &e);
    while (e!=\n)
    {
        s = (DNode)malloc(sizeof(struct node)); //新节点分配空间
        s->data = e;
        s->prior = (*head);   //新节点的prior连前一个结点
        s->next = (*head)->next; //新节点的next连后边结点
        (*head)->next->prior = s; //后一个结点的prior连新结点
        (*head)->next = s;  //新节点前面的next连新结点
        scanf("%c", &e);
    }
}
//向后遍历输出
void PrintList1(DNode L) {
    DNode p;
    p = L;
    p = p->next;
    while (p != L) {
        printf("%c", p->data);
        p = p->next;
    }
    printf("\n");
}
//向前遍历输出
void PrintList2(DNode L) {
    DNode p;
    p = L->prior;
    while (p != L) {
        printf("%c", p->data);
        p = p->prior;
    }
    printf("\n");
}
//查找第i处数据的地址
DNode FindPosition(DNode L,int i) {
    int j = 0;
    DNode p = L;
    while (p->next != L&&j < i) {
        p = p->next;
        j++;
    }
    return p;
}
//插入
void InsertList(DNode L) {
    DNode s,p;  //s为新结点 p为新节点前一个结点
    int i;
    char e;
    printf("在第几处插入:\n");
    scanf("%d", &i);
    getchar();
    printf("插入什么数据:\n");
    scanf("%c", &e);
    p = FindPosition(L, i-1);  //新节点前一个结点地址
    s = (DNode)malloc(sizeof(struct node));//申请新节点空间
    s->data = e;
    s->prior = p;  //新节点的prior连上前一个结点
    s->next = p->next;  //新节点的next连上后一个结点
    p->next->prior = s;  //新节点后的结点的prior连上新结点
    p->next = s;         //新节点前的结点的next连上新结点
}
//删除
 void DeleteList(DNode L){
     DNode s,p;  //s为新结点 p为要删除的结点
     int i;
     printf("删除第几处的数据:\n");
     scanf("%d", &i);
     p = FindPosition(L, i); //要删除结点的地址
     p->prior->next = p->next;  //要删除的结点的前一个结点的next,连上要删结点后的结点
     p->next->prior = p->prior;//要删除结点的后一个结点的prior,连上要删结点的前一个结点
     free(p);
 }


int main() {
    DNode list;
    CreatNode(&list);
    //PrintList1(list);
    PrintList2(list);
    InsertList(list);
    PrintList2(list);
    DeleteList(list);
    PrintList2(list);
}

 

双向链表的基本操作 C语言

标签:一个   next   插入   std   turn   col   scanf   创建   post   

原文地址:https://www.cnblogs.com/yudongxuan/p/8297470.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!