原文: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. Codeforces Round #216 (Div. 2) E. Valera and Queries (BIT)

    标题效果: 给很多分布 x 行轴. 然后给出了一个非常的多点集,问该组点分布多少不同段. IDEAS: 分散成多个线段点集的. 给出的线段的话,也就是说这个点集上不会有点在这条线段上. 所以我们就是求 ...

  2. 动态规划,而已! CodeForces 433B - Kuriyama Mirai&#39;s Stones

    Kuriyama Mirai has killed many monsters and got many (namely n) stones. She numbers the stones from  ...

  3. C++,Python,Go对照学习-01

    好吧其实学Go只是为了好玩,只是为了好玩,学习过程中不免会把其他我懂的语言的思维定势和习惯带进来,由此有了这篇对照学习的记录,就当是留下学习的脚印吧. 这里所提及的语言特性在C++指最新的C++11标 ...

  4. NSIS:使用FileFunc.nsh头文件判断文件版本

    原文 NSIS:使用FileFunc.nsh头文件判断文件版本 这里,轻狂拿WMP10做一个例子.关于WMP10的原始安装文件,可以下载后通过/C /T:D:\Windows Media Player ...

  5. Linux在device is busy处理

    在Linux管理umount设备时,时常会遇到"device is busy", 假设umount一个文件系统碰到这样的情况.而且你并没有在所需卸载的文件夹下.那么非常可能实用户或 ...

  6. 一键安装 gitlab7 on rhel6.4 并设置邮件发送

    一键安装 gitlab7 on rhel6.4 并设置邮件发送 世间本无事,庸人自扰之.书归正传,简短节说:gitlab是个好东西,可是安装手冊奇烂.尽管以前对比文档一步一步安装起来gitlab 6. ...

  7. twitter接口开发

    前一阵子研究了下twitter接口,发现网上的资料不是很多.遂花了些心血,终于有所收获~ 现在有时间赶紧整理出来便于自己以后查阅,也想帮助有困难的同学们.废话不多说,现在就以最简洁的方式开始了.注意: ...

  8. Online网站集

    http://tool.oschina.net/apidocs/    在线工具(IT技术工具)

  9. 可视化配置以及Net应用MemCache在win7

    MemCache在win7上的可视化配置以及Net应用   惯例科普:MemCache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以 ...

  10. mysql 修改[取消]timestamp的自动更新

    创建自动更新的 timestamp (插入或修改时 uptime都会自动更新) CREATE TABLE `hello` ( `id` int(11) NOT NULL, `uptime` times ...