原文: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. JAVA中的I/O流以及文件操作

    一 JAVA语言中主要通过流来完成IO操作. 流:计算机的输入输出之间流动的数据序列,也是类的对象.java中的流方式就像是建立在数据交换源和目的之间的一条通信路径. 数据源:计算机中的数据源是指可以 ...

  2. BZOJ 2435 NOI2011 道路建设 BFS/DFS

    标题效果:给定一个树(直接将树.不要贪图生成树图!).寻找每条边权值*分差的两侧之间 BFS水必须是能 竟DFS能够住...系统堆栈可能有些不够,我们可以使用内联汇编手册中大型系统堆栈 详见代码 这个 ...

  3. python在windows通过安装模块错误

    我的环境是win7+vs2013+python3.2,他们是32地点 windows通过安装模块错误 1)Unable to find vcvarsall.bat : 打开"<pyth ...

  4. Mybatis如何SQL声明表名称参数

    insert into prefix_${table_name} (a, b, c) values (#{a}, #{b}, #{c}) ${} 它代表了直接使用字面(literal value) # ...

  5. HDU 4832(DP+计数问题)

    HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行.然后相乘累加起来就是答案 代码: #include <stdio.h> #include < ...

  6. 介绍4种HTML5 Canvas库

    1.bHive.js Library http://www.bhivecanvas.com/ bHive能创建丰富的用户体验.动画.游戏,能够使开发更简单. demo: http://www.bhiv ...

  7. hdu 4884 TIANKENG’s rice shop(模拟)

    # include <cstdio> # include <algorithm> # include <cstring> # include <cstdlib ...

  8. 数组名取地址所算数运算应注意的&quot;trap&quot;

    数组名取地址所算数运算应注意的"trap" 直接看代码: #include <stdio.h> int main() { int array[5]; printf(&q ...

  9. 创建Windows类别

    Windows在表单.控制.对话框基本上形成.Windows类是Windows形式的类型,可处理叙述性说明. 在Windows提前有很多定义Windows类别,但它可以很容易地创建自己的Windows ...

  10. The Swift Programming Language中国完整版

    近来的ios的swift语言似乎火了.我没有objectc基金会,但在此之前有c随着java在...的基础上.从几天开始学习ios的swift语言,晚发表在博客形式.下面是英文版本翻译swif图书.还 ...