数据结构之---c语言实现双向链表操作

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct DoubleLinkedList
{
     ElemType data;
     struct DoubleLinkedList *pre;
     struct DoubleLinkedList *next;
}DlinkedList_Node;  

//建立链表
DlinkedList_Node* create_dlink()
{
   DlinkedList_Node *head,*p,*s;
   int x;
   head = (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node));
   p = head;
   while(1)
   {
       printf("请输入要保存的节点, 以0结束输入:\n");
       scanf("%d",&x);
       if(x != 0)
       {
          s = (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node));
          s ->data = x;
          s-> pre = p;
          p->next = s;
          p=s;
       }
       else
       {
          printf("\n数据输入结束\n");
          break;
       }
    }
    p->next = NULL;
    head = head ->next;
    head->pre = NULL;
    return head;
}  

//顺序、反序打印链表
void print_dlink(DlinkedList_Node *head)
{
	DlinkedList_Node *p,*s;
    p = head;
    printf("正序输出双向链表中的节点:\n");
    while(p)
    {
        printf("%d ",p->data);
        s = p;
        p = p->next;
    }
    printf("\n 逆序输出双向链表中的节点: \n");
    while(s)
    {
        printf("%d ",s->data);
        s = s->pre;
    }
    printf("\n \n");
}  

//删除所指定的元素的节点
DlinkedList_Node* delete_dlinkedlist_node(DlinkedList_Node *head,int i)
{
    DlinkedList_Node *p;
    p = head;
    if(p->data == i)
    {
        head = p->next;
        head->pre = NULL;
        free(p);
        return head;
    }
    while(p)
    {
        if(p->data == i)
        {
         	p->pre->next = p->next;
            p->next->pre = p->pre;
            free(p);
            return head;
         }
         p = p->next;
     }
     printf("抱歉输入数据有误!,没有找到想要删除的数据\n");
     return head;
 }

//插入一个结点
DlinkedList_Node* insert_dlinkedlist_node(DlinkedList_Node *head,int i)
{  

   DlinkedList_Node *p,*temp;
   p = head;
   temp = (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node));
   temp ->data = i;
   if(i < p->data)//比头结点数据小,插入到链表头部
   {
       head = temp;
       head->next = p;//此处p为原来的head
       head->pre = NULL;
       p->pre = head;//此处p为原来的head
       return head;
    }

    while(p != NULL && i > p->data)//寻找合适的插入位置
    {
       p = p->next;
    }
    if(i < p->data)//在链表中间某处找到合适插入位置
    {
        temp ->next = p;
        temp ->pre = p->pre;
        p ->pre->next = temp;
        p ->pre = temp;
        return head;
     }
	else//没有找到合适的位置,只有将数据插入到链表尾部
     {
         p->next = temp;  //遍历到链表尾部,p==NULL
         temp ->pre = p;
         temp ->next = NULL;
         return head;
      }
}  

int main()
{
    DlinkedList_Node *head;
    head = create_dlink();
    print_dlink(head);
    return 0;
}

时间: 2024-10-10 22:23:16

数据结构之---c语言实现双向链表操作的相关文章

读数据结构(C语言版)

数据:数据是对现实世界物质的符号表示,在计算机中的意思是能输入到计算机中进行计算处理的符号为数据:是客观世界在计算机中的表示方式,是程序加工的原材料.数据可以是声音,图片,文档 数据元素:组成数据的基本构成单位,通常以结构化的形式出现,比如一本书的书目信息,包含作者,书名,出版刊号,出版社这些数据项,数据项是组成数据元素不可在分割的最小单位了. 数据对象:是具有相同结构的数据元素的集合,是数据的子集,相当于集合的概念: 数据结构:描述的是数据元素之间关系的事情,我们把这种数据元素之间关系称之为结

数据结构算法C语言实现(七)--- 3.1 的线性实现及应用举例

一.简述 栈,LIFO.是操作受限的线性表,和线性表一样有两种存储表示方法.下面以顺序存储为例,实现. 二.ADT 暂无. 三.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 46 9 10 #ifndef _3_1_H_ 11 #define _3_1_H_ 12

数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈及相关操作是第三章实现的,但数据类型做了更改. 二.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>&g

数据结构算法C语言实现(一)---2.3线性表的顺序表示和实现

注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实现,主要操作包括建表,插入元素,删除元素,查找元素,合并表等操作,根据书中伪代码编写了C语言,使用int类型进行了测试,需要注意的是查找元素时使用了函数指针,C语言初学者不易理解,可查阅相关书籍学习. 二.头文件 1 //head.h 2 /** 3 My Code 4 */ 5 #include

数据结构算法C语言实现(六)---2.4一元多项式的表示及相加

一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 1 抽象数据类型一元多项式的定义 2 ADT Polyomail{ 3 数据对象:D = {a[i]|a[i]属于TermSet, i = 1,2,3...,m,m>=0 4 TermSet中每个元素包含一个表示系数的实数和表示指数的整数} 5 数据关系 6 基本操作: 7 CreatPolyn(&P, m) 8 操作结果:输入 m 项的系数和指数,建立一元

数据结构(c语言描述)

数据结构(c语言描述) 目录 预备的数学知识 什么是数据结构 线性表 栈和队列 数组 串 树和二叉树 查找 排序 预备的数学知识 等差数列求和 Sn=(a1+an)*n/2 等比数列求和 Sn=a1*(1-q?)/(1-q) 什么是数据结构 基本概念 数据: 能够被计算机识别和处理的符号的集合 数据元素:是数据的基本单位,由若干的数据项构成,如一个人有手有脚 数据对象:由同类型的数据元素组成的集合,如一群人 数据类型:由一个集合和定义在此集合上的操作组成 原子类型:值不可再分的数据类型,如int

数据结构算法C语言实现(十)--- 3.3栈与递归的实现

一.简介 汉诺塔问题是递归的一个典型例子,而且书上的讲解很详细,对理解C语言函数及函数传参的工作机制很有帮助,值得一看.而且,递归在我看来和分治.DP.贪心等一样是十分优美的思想,值得学习!!! 二.CPP文件 1 //3_3.cpp 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-8 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 54 9

数据结构上机测试2-1:单链表操作A (顺序建表+关键字删除)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em