C语言双向链表
原文: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语言双向链表的更多相关文章
- 贪吃蛇游戏——C语言双向链表实现
采用了双向链表结点来模拟蛇身结点: 通过C语言光标控制函数来打印地图.蛇身和食物: /************************** *************************** 贪吃 ...
- C语言双向链表讲解
一.双向链表的概念 双向链表基于单链表.单链表是单向的,有一个头结点,一个尾结点,要访问任何结点,都必须知道头结点,不能逆着进行.而双链表添加了一个指针域,通过两个指针域,分别指向结点的前结点和后结点 ...
- (C/C++学习)18.C语言双向链表
说明:数组提供了连续内存空间的访问和使用,而链表是对内存零碎空间的有效组织和使用.链表又分为单向链表和双向链表,单向链表仅提供了链表的单方向访问,相比之下,双向链表则显得十分方便. 一.单向链表的节点 ...
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)
概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...
- 队列的图文解析 和 对应3种语言的实现(C/C++/Java)
概要 本章和介绍"栈"时的流程一样,先对队列进行介绍,然后分别给出队列的C.C++和Java三种语言的实现.内容包括:1. 队列的介绍2. 队列的C实现3. 队列的C++实现4. ...
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)【转】
概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...
- 用C语言把双向链表中的两个结点交换位置,考虑各种边界问题。
用C语言把双向链表中的两个结点交换位置,考虑各种边界问题. [参考] http://blog.csdn.net/silangquan/article/details/18051675
- 「C语言」单链表/双向链表的建立/遍历/插入/删除
最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...
- 4-29 c语言之栈,队列,双向链表
今天学习了数据结构中栈,队列的知识 相对于单链表来说,栈和队列就是添加的方式不同,队列就相当于排队,先排队的先出来(FIFO),而栈就相当于弹夹,先压进去的子弹后出来(FILO). 首先看一下栈(St ...
随机推荐
- Swift 书面 ToDo App
下面的代码是使用的全部Xcode Version 6.0.1 (6A317)书面. 因为当使用团队开发stroyboard在并购的诸多不便的时间,所有或使用.xib该文件准备ToDo App. 想要实 ...
- poj 1699 Best Sequence(AC自己主动机+如压力DP)
id=1699" target="_blank" style="">题目链接:poj 1699 Best Sequence 题目大意:给定N个D ...
- HDOJ 4974 A simple water problem
A simple water problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O ...
- css小技巧,如何制作一个箭头符号
首先上图: 第一种方法大家可能想到了,就是用背景图片制作箭头符号,但是下面介绍的不是这种方法. 在介绍通过border制作箭头符号之前,先看下下面的css代码: <!DOCTYPE html&g ...
- atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系
atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系 1. server控件是要server了解了标签.种类型的server控件: 1 1. ...
- WebService之CXF注解报错(一)
WebService之CXF注解 1.详细报错例如以下 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] ...
- 注册表 ControlSet001、ControlSet002以及CurrentControlSet
首先说说ControlSet几组控制之间的关系. 注册表HKLM\system注意 注册表项包含windows启动的三个控件组(额外还可能存在一个备份控件组).在初始状态下.它们各自是Con ...
- HDoj-1879-畅通project-并查集
继续畅通project Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- Android Drawable绘图学习笔记(转)
如何获取 res 中的资源 数据包package:android.content.res 主要类:Resources Android SDK中的简介:Class for accessing an ap ...
- ios正在使用NSDateComponents、NSDate、NSCalendar它的结论是在当前时间是在一段时间在一天。
一般应用程序设置这一组的存在,比如夜间模式,如果你.从8:00-23:00.在这个当前的时间是如何推断出期间.主要的困难在于如何使用NSDate生成8:00时间和23:00时间.然后用当前时间,也许有 ...