双向链表的基本操作

原创 2015年07月06日 22:16:22

#include <stdio.h>
#include <stdlib.h>
typedef struct List
{
     struct List *next,*prev;
     int item;
}List,*link;
link init();    //链表的初始化
link headinsert(); //每次在链表的头部添加新结点
link orderinsert();  //创建一个顺序的链表
link delete(link ,int);  //在链表中找到元素并删除
void show(link );

int main()
{
    List *p,*q,*L;
    printf("头插入法创建双向链表: \n");
    p = headinsert();
    show(p->next);
    printf("创建非降序双向链表: \n");
    q = orderinsert();
    show(q->next);
    printf("删除指定元素: \n");
    L = delete(q->next,20);
    show(L);
    return 0;
}

link init()
{
    List *st = malloc(sizeof(*st));
    st->next = NULL;
    st->prev = NULL;
    return st;
}

link headinsert()
{
    int x;
    List *st;
    st = init();
    while(scanf("%d",&x) != EOF)
    {
        st->item = x;
        List *p = malloc(sizeof(*p));
        st->prev = p;
        p->next = st;
        p->prev = NULL;
        st = p;
    }
    return st;
}

link orderinsert()
{
    int x;
    List *head,*st;
    st = init();
    head = st;
    while(scanf("%d",&x) != EOF)  //顺序输入数据
    {
        List *q = malloc(sizeof(*q));
        q->item = x;
        st->next = q;
        q->prev = st;
        q->next = NULL;
        st = st->next;
    }
    return head;

}

link delete(link st,int a)
{
    List *p,*t;
    int i = 0;
    p = st;
    while(st->next != NULL)
    {
        if(st->item == a)
        {
            st->prev->next = st->next;
            st->next->prev = st->prev;
            t = st->next;
            free(st);
            st = t;
            i++;
            break;
        }
        else
          st = st->next;
    }
    if(!i)
        printf("链表中没有此元素:%d!",a);
    return p;
}

void show(link st)
{
    int N = 0;
    while(st->next != NULL)
    {
        printf("%5d",st->item);
        st = st->next;
        N++;
    }
    printf("\n");
    printf("链表中元素个数为%d\n",N);
}

双向链表的建立与基本操作

双向链表比单链表有更好的灵活性,其大部分操作与线性表相同。下面总结双向链表与单链表之间的不同之处及我在实现过程中所遇到的问题。1.双向链表的建立 双向链表在初始化时,要给首尾两个...
  • kelvinmao
  • kelvinmao
  • 2016年04月02日 18:39
  • 3612

双链表的基本操作

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。       为了练习,...
  • GaoXiang_
  • GaoXiang_
  • 2012年12月10日 19:18
  • 14020

数据结构——双向链表实现,基本操作的C++版

对于循环双向链表 判断一个链表是否为空的条件为:head->next==head (头指针) 判断*p为最后一个节点的条件为:p->next=head [cpp] v...
  • Tom_and_Jerry_zhao
  • Tom_and_Jerry_zhao
  • 2015年11月28日 22:05
  • 2234

双向链表的基本操作

双向链表的插入顺序: 双向链表的删除顺序: #include #include typedef struct doubleLink { int data;...
  • acm_JL
  • acm_JL
  • 2016年03月21日 20:30
  • 1822

双向链表基本操作及代码优化技巧

以下是本人对双向链表的相关操作及相应的代码优化学习笔记 1 双向链表的插入有4种情况: 1.1 插入到链表的开始位置 1.2 插入到链表的中间位置 1.3 插入到链表的结束位置 1.4 链表为空,既...
  • pengqian652
  • pengqian652
  • 2013年10月30日 15:59
  • 1037

(C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作

上午写了下单向循环链表的程序,今天下午我把双向链表的程序写完了。其实双向链表和单向链表也是有很多相似的地方的,听名字可以猜到,每个节点都包含两个指针,一个指针指向上一个节点,一个指针指向下一个节点。这...
  • u011248694
  • u011248694
  • 2014年02月23日 17:02
  • 15357

《数据结构》双向链表的基本操作

双向链表的操作 双向链表的基本操作包括:判断链表是否为空、计算链表的长度、遍历链表,这3中操作的方法和单链表一样,主要和双向链表中的指向后继的指针有关。 双向链表的插入和删除操作和单链表是有区别的:双...
  • sungaochao
  • sungaochao
  • 2016年03月04日 23:18
  • 328

双向链表的创建和相关操作

双向链表其实是单链表的改进。     当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结...
  • jw903
  • jw903
  • 2014年08月30日 21:34
  • 2096

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

  • 2017年05月02日 11:03
  • 172KB
  • 下载

双向链表的基本操作

学过单向链表的小伙伴都知道单向链表中的每一个节点有且只有一个指针,这个指针就是用来指向下一个节点的,单向链表顾名思义就是链表方向是单方向的,而本文要介绍的双向链表就是链表方向是双方向的,也就是双向链表...
  • zouleideboke
  • zouleideboke
  • 2017年07月27日 22:46
  • 210
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:双向链表的基本操作
举报原因:
原因补充:

(最多只允许输入30个字)