文档章节

双向链表的操作

胡若晨
 胡若晨
发布于 2016/03/31 22:41
字数 814
阅读 10
收藏 0
/*************************************************************************
    > File Name: double_link.c
    > Author: heathcliff
    > Mail: --------------------------- 
    > Created Time: 2016年03月30日 星期三 11时15分05秒
 ************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct DulNode
{
    char name[20];
    struct DulNode *prior,*next;
}stud;

stud *create(int n);
void print(stud *head);
void search(stud *head,int n);
stud *delete(stud *head,int n);
stud *insert(stud *head,int n);

int main(void)
{
    stud * head;
    int n = 3;

    head = create(n);   
    print(head);
//  search(head,n);
//  head = delete(head,n);
//  print(head);
    head = insert(head,n);

    return 0;
}

stud *create(int n)
{
    stud *p,*head,*s;
    int i;
    head = (stud *) malloc (sizeof(stud));
    head->name[0] = '\0';
    head->next = NULL;
    p = head;

    for(i = 0;i<n;i++){
        s = (stud *) malloc (sizeof(stud));

        printf("please input student's name:");

        scanf("%s",p->name);
        /*将p和s连接起来*/
        p->next = s; //指定后继节点
        s->prior = p;//指定前驱节点
        p = p->next;//p 向后移动一格
        //p = s;//这个也是可以的
    }

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

    return head;
}

void print(stud *head)
{
    stud *p;
    p = head;

    while(p != NULL){
        printf("\n------------print--------\n");
        printf("%4s\n",p->name);
        p = p->next;
    }
}

void search(stud *head,int n)
{
    int ser,i = 0;
    stud *p;

    p = head;

    printf("\n请输入要寻找第几个(从0开始):");
    scanf("%d",&ser);

    while(i != ser && i <= n){//此处不能写为i<n,
        //否则最后一个元素将无法查找到
        i++;
        p = p->next;
    }
    if(i==n)
        printf("没找到\n");
    else{
        printf("已经找到,你要的信息是:\n");
        printf("%s\n",p->name);
    }
}
stud *delete(stud *head,int n)
{
    stud *p,*s;
    int del, i = 0;
    p = head;

    printf("请输入你要删除的信息的序号:");
    scanf("%d",&del);

    while(i != del && i <= n){//此处不能写为i<n,
        //否则最后一个元素将无法查找到
        s = p;
        i++;
        p = p->next;
    }
    if(i==n)
        printf("没找到\n");
    else{
        printf("已经找到,你要删除的信息是:\n");
        printf("%s\n",p->name);

        /*开始删除*/
        if(i == 0){ //说明删除的是头节点
            head = p->next;
            head->prior = NULL; 
        }
        else{
            s->next = p->next;
            s->prior = p->prior;
        }

        printf("删除成功\n");
        free(p);
        n--;
    }

    return head;
}

stud *insert(stud *head,int n)
{
    stud *p,*s;
    p = head;
    int ser,i = 0;
    char ins[20];
    char p_temp[20];

    printf("\n请输入你要插入的信息:");
    scanf("%s",ins);

    s = (stud *) malloc (sizeof(stud));
    strcpy(s->name,ins);

    printf("\n请输入要插入***的后面:");
    scanf("%d",&ser);

    while(i != ser){//此处不能写为i<n,
        //否则最后一个元素将无法查找到
        i++;
        p = p->next;
    }
    if(i==n)
        printf("没找到\n");
    else{
        printf("已经找到,你要的信息是:\n");
        printf("%s\n",p->name);
        printf("----------\n");
    }
    s->next = p->next;
    //printf("p->next->name = %s\n",p->next->name);
    //printf("s->next->name = %s\n",s->next->name);
    p->next->prior = s;
    //printf("p->next->prior->name = %s\n",p->next->prior->name);
    s->prior = p; //负责连接
    //printf("p->prior->name = %s\n",p->prior->name);
    p->next = s;//负责连接
    //printf("p->next->name = %s\n",p->next->name);

    //printf("\np->next->prior->name = %s\n",p->next->prior->name);
    //printf("p->prior->next->name = %s\n",p->prior->next->name);
    //printf("p->next->name = %s\n",p->next->name);
    //printf("p->prior->name = %s\n",p->prior->name);
    p = head;
    while(p != NULL){
        printf("\n------------print--------\n");
        printf("%4s\n",p->name);
        p = p->next;
    }
    free(p);

    return head;
}

在插入这里我想理顺一下,在各大博客、论坛上,所有的插入都长一个样,索性自己画了一个长得不一样的(电脑画太麻烦了,手绘,不喜勿喷哈) 
1.s->next = p->next; 
2.p->next->prior = s; 
3.s->prior = p; 
4.p->next = s; 



© 著作权归作者所有

胡若晨
粉丝 3
博文 14
码字总数 7894
作品 0
包头
私信 提问
加载中

评论(1)

胡若晨
胡若晨 博主
第一张图看来上传的有点问题,不过不影响整体效果
线性表--链式存储结构--双向链表

双向链表 一、双向链表结构 双向链表结点结构 双向链表结点结构.png 既然单链表可以有循环链表,那么双向链表当然也可以有。 非空的双循环链表.png 由于这是双向链表,那么对于链表中的某一个...

JS_HCX
2018/03/29
0
0
Java容器类框架分析(2)LinkedList源码分析

概述 在分析LinkedList的源码之前,先看一下ArrayList在数据结构中的位置,常见的数据结构按照逻辑结构跟存储结构可以做如下划分: 数据结构分类 先看看源码的注释: Doubly-linked list imp...

wustor
2017/11/06
0
0
看动画轻松理解「链表」实现「 LRU 缓存淘汰算法」

作者 | 吴至波 责编 | 胡巍巍 前几节学习了「链表」、「时间与空间复杂度」的概念,本节将结合「循环链表」、「双向链表」与 「用空间换时间的设计思想」来设计一个很有意思的缓存淘汰策略:...

CSDN资讯
03/03
0
0
数据结构基础(12) --双向循环链表的设计与实现

双向链表的操作特点: (1) “查询” 和单链表相同; (2)“插入” 和“删除”时需要同时修改两个方向上的指针。 但是对于双向循环链表则在表尾插入非常的迅速, 只需O(1)的时间,因为有指向前面的...

翡青
2015/01/06
0
0
搞懂 Java LinkedHashMap 源码

LinkedHashMap 源码分析 上周学习了 的源码感觉收获颇多,虽然红黑树这个坑自己还没有填,但是我没脸没皮的先看了 的源码。因为的确跟有很大关系,看完这篇文章相信大家也会有这种感觉。由于...

群星纪元
03/31
3
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
昨天
64
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
昨天
26
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
昨天
43
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
昨天
27
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
昨天
44
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部