原文:C语言双向链表

  今天写了点双向链表的各种操作,写插入的时候费了点时间,不过,现在看来还是值得耗费那点时间去写的,这种小东西应该能信手拈来才行啊。

 /*双向链表*/
#include <stdio.h>
#include <string.h> /*strcmp(const char *,const char *) return 0 is equal*/ typedef struct dulnode
{
char name[];
struct dulnode *prior,*next;
}stud;
/*创建,返回链表头指针,参数n-节点个数*/
stud * create(n);
/*查找,返回节点地址,参数h-链表头指针,name为查询条件*/
stud * search(stud *h,char *name);
/*删除*/
void del(stud *p);
/*显示,参数-h,链表头节点,num-显示节点个数*/
void show(stud *h,int num);
/*求链表长度*/
int length(stud *head);
/*插入节点,参数head-链表头节点,name-节点,n-节点位置*/
stud *insert(stud *head,char *name,int n);
int main()
{
stud *head,*re,*in;
head = create();
show(head,);
re = search(head,"Accipiter");
show(re,);
del(re);
re = head->next;
show(re ,);
in = insert(re , "cnblogs",);
show(in,);
return ;
}
void show(stud *head,int num)
{
stud *sp;
int cnt = ;
if(NULL == head)
{
printf("It's NULL!\n");
return;
}
if(num>length(head))
{
printf("It's Full\n");
return ;
}
if(strcmp(head->name,"") == )
{
sp = head->next;
}
else
{
sp = head;
}
while(sp)
{
printf("name %d:%s\n",cnt,sp->name);
if(cnt == num)
{
sp = NULL;
}else
{
sp = sp->next;
cnt++;
}
}
} stud * create(n)
{
stud *p,*h,*s;/*p-前指针,h-头指针,s-后指针*/
int i;
/*构建头指针*/
h = (stud *)malloc(sizeof(stud));
if(h == NULL)
{
return NULL;
}
h->name[] = '\0';
h->prior = NULL;
h->next = NULL;
/*插入节点*/
p = h;
for(i=;i<n;i++)
{
s = (stud *)malloc(sizeof(stud));
if(NULL == s)
{
printf("node malloc error!\n");
break;
}
p->next = s;
printf("%d's name:\n",i+);
gets(s->name);
s->prior = p;
s->next = NULL;/*末尾插入*/
p = s;
}
p->next = NULL;
return (h);
} stud * search(stud *head , char *name)
{
stud *p,*re=NULL;
p=head->next;
while(p)
{
if(strcmp(p->name,name) == )
{
re = p;
p = NULL;
}
else
{
p = p->next;
}
}
if(re == NULL)
{
printf("Can't Find!\n");
}
return (re);
} void del(stud *p)
{
if(p == NULL|| (strcmp(p->name,"")==))
{
printf("is Null or head!\n");
return;
}
else
{
p->next->prior = p->prior;
p->prior->next = p->next;
free(p);
}
} int length(stud *head)
{
int len=;
stud *sp;
if(head != NULL)
{
len = ;
sp = head->next;
while(sp)
{
sp = sp->next;
len++;
}
}
return len;
} stud *insert(stud *head , char *name , int n)
{
stud *p,*nhead;
int cnt=;
if(strcmp(head->name,"") != )
{
cnt=;
}
nhead = head;
if(n>length(head)||n<)
{
printf("It's Full or Error!\n");
return NULL;
}
/*插入节点*/
while(cnt<n)
{
head = head->next;
cnt++;
}
p = (stud *)malloc(sizeof(stud));
if(p != NULL)
{
strcpy(p->name,name);
p->next = head->next;
p->prior = head; if(head->next)/*双向链表操作这里很重要*/
head->next->prior=p;
head->next=p;
} return nhead;
}

C语言双向链表的更多相关文章

  1. 贪吃蛇游戏——C语言双向链表实现

    采用了双向链表结点来模拟蛇身结点: 通过C语言光标控制函数来打印地图.蛇身和食物: /************************** *************************** 贪吃 ...

  2. C语言双向链表讲解

    一.双向链表的概念 双向链表基于单链表.单链表是单向的,有一个头结点,一个尾结点,要访问任何结点,都必须知道头结点,不能逆着进行.而双链表添加了一个指针域,通过两个指针域,分别指向结点的前结点和后结点 ...

  3. (C/C++学习)18.C语言双向链表

    说明:数组提供了连续内存空间的访问和使用,而链表是对内存零碎空间的有效组织和使用.链表又分为单向链表和双向链表,单向链表仅提供了链表的单方向访问,相比之下,双向链表则显得十分方便. 一.单向链表的节点 ...

  4. 栈的图文解析 和 对应3种语言的实现(C/C++/Java)

    概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...

  5. 队列的图文解析 和 对应3种语言的实现(C/C++/Java)

    概要 本章和介绍"栈"时的流程一样,先对队列进行介绍,然后分别给出队列的C.C++和Java三种语言的实现.内容包括:1. 队列的介绍2. 队列的C实现3. 队列的C++实现4.  ...

  6. 栈的图文解析 和 对应3种语言的实现(C/C++/Java)【转】

    概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...

  7. 用C语言把双向链表中的两个结点交换位置,考虑各种边界问题。

    用C语言把双向链表中的两个结点交换位置,考虑各种边界问题. [参考] http://blog.csdn.net/silangquan/article/details/18051675

  8. 「C语言」单链表/双向链表的建立/遍历/插入/删除

    最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...

  9. 4-29 c语言之栈,队列,双向链表

    今天学习了数据结构中栈,队列的知识 相对于单链表来说,栈和队列就是添加的方式不同,队列就相当于排队,先排队的先出来(FIFO),而栈就相当于弹夹,先压进去的子弹后出来(FILO). 首先看一下栈(St ...

随机推荐

  1. Servlet(五岁以下儿童)web.xml一些常用的配置

    (1)lode-on-startup,这Servlet该项目启动时它将被称为(从主要的电话init办法,为了安全起见,一般不应为Servlet建立URL制图).一些数据通常被用作前处理,或使用多线程建 ...

  2. 【Flume】flume于transactionCapacity和batchSize进行详细的分析和质疑的概念

    我不知道你用flume读者熟悉无论这两个概念 一开始我是有点困惑,? 没感觉到transactionCapacity的作用啊? batchSize又是干啥的啊? -- -- 带着这些问题,我们深入源代 ...

  3. PHP实现协同程序

    于server其中编程.为了实现异步.通常情况下,需要回调.比例如下面的代码 function send($value) { $data = process($value); onReceive($d ...

  4. 一起写2048(160行python代码)

    前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家.而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到20 ...

  5. OpenGL 实现Interpolation插值算法

    这是一个静态插值算法的效果,图形学中插值算法应用十分广.如动画.photoshop, autocAD等软件画曲线,还有shader中的渐变上色也是一个硬件支持的插值算法. Interpolation是 ...

  6. 基于docker构建jenkins和svn服务(转)

    码农们很定都知道svn的重要性,机器坏掉丢代码的惨痛教训想必很多人都有. jenkins可能很多人都不了解.这是一个持续集成的工具,在敏捷开发领域很流行:跟svn结合可以实现定期build.check ...

  7. hdu 4965 Fast Matrix Calculation(矩阵高速幂)

    题目链接.hdu 4965 Fast Matrix Calculation 题目大意:给定两个矩阵A,B,分别为N*K和K*N. 矩阵C = A*B 矩阵M=CN∗N 将矩阵M中的全部元素取模6,得到 ...

  8. Android4.4 蓝牙源代码段分析

    最近GOOGLE发布时间Android4.4,我看了看源代码.4.4蓝牙打开过程或这部分的一些变化,判断蓝牙开关是从接口设置settings在里面switch开关,widget当然,它可以切换,也许启 ...

  9. Gradle 2.0用户手册——总览(译)(转)

    2.1 特性 本章将介绍一系列Gradle的特性. 申明式构建和基于约定的构建 Gradle的核心是基于Groovy呈现了一种丰富的针对特定领域的语言,称之为Domain Specific Langu ...

  10. Java设计模式菜鸟系列(十三)建模和实现状态模式

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39829859 状态模式(State):同意对象在内部状态改变时改变它的行为,对象看起来好像 ...