数据结构之双链表的基本操作
来源:互联网 发布:鳄鱼毒品知乎 编辑:程序博客网 时间:2024/05/01 15:33
////////////////////////////////////////////
//双链表的初始化,建立,插入,查找,删除。//
////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
typedef
int
ElemType;
////////////////////////////////////////////
// 定义双链表结点类型
typedef
struct
Node
{
ElemType data;
struct
Node *prior;
//指向前驱结点
struct
Node *next;
//指向后继结点
}Node, *DbList;
////////////////////////////////////////////
//双链表的建立,采用尾插法建立双链表
DbList DbListCreat()
{
Node *L,*p,*r;
L = (Node *)
malloc
(
sizeof
(Node));
//申请头结点
L->next = NULL;
r = L;
r->next = NULL;
//r 为指向终端结点的指针
ElemType x;
while
(
scanf
(
"%d"
,&x) != EOF)
//输入双链表元素,建立双链表
{
p = (Node *)
malloc
(
sizeof
(Node));
p->data = x;
p->next = r->next;
r->next = p;
r = p;
}
r->next = NULL;
return
L;
}
/////////////////////////////////////////
//双链表的测长
int
getLength(DbList L)
{
DbList p;
int len=0;
if(L==NULL)
return 0;
p = L->next;
while(p!=NULL)
{
p=p->next;
len++
}
return len;
}
/////////////////////////////////////////
//双链表的查找,查找元素为x的位置
int
DbListFind(DbList L,ElemType x)
{
DbList p;
//p为检索,
p = L->next;
int
i = 1;
while
(p != NULL && p->data != x )
//寻找值为x的元素**注意这里循环的条件不能写反
{
//原因,当p == NULL 时候 p->data 会出错
++i;
// for (i = 1, p = L->next; p; p = p->next, i++) {
// if (p->data == x) break;}
p = p->next;
}
if
(p == NULL)
//如果没找到返回0
return
0;
else
return
i;
//如果找到返回i
}
/////////////////////////////////////////
//双链表的插入,在双链表中的第i个位置插入值为x的元素
DbList DbListInsert(DbList L,
int
i,ElemType x)
{
DbList p,s;
//s为要插入的结点
p = L->next;
//从第一个结点位置开始查找
int
tempi;
for
(tempi = 1;tempi < i-1; tempi++)
p = p->next;
s = (Node *)
malloc
(
sizeof
(Node));
s->data = x;
//将x赋值到s的数据域
s->next = p->next;
//将结点插入
p->next->prior = s;
s->prior = p;
p->next = s;
return
L;
}
//////////////////////////////////////////////
//双链表的删除,删除双链表中第i个结点
DbList DbListDelete(DLinkList L,
int
i)
{
int
tempi = 1;
DbList p;
//p为查找结点。
p = L->next;
while
((tempi++) != i && p != NULL)
{
p = p->next;
}
if
(p == NULL)
//检查是不是在双链表中的位置
printf
(
"位置不合法。\n"
);
else
if
(p->next == NULL)
//最后一个结点特殊处理,原因最后一个结点p->next没有prior
{
p->prior->next = NULL;
free
(p);
}
else
//进行删除操作
{
p->prior->next = p->next;
p->next->prior = p->prior;
free
(p);
}
}
0 0
- 数据结构之双链表的基本操作
- 数据结构之顺序表的基本操作
- 数据结构之图(图的基本操作)
- 数据结构之顺序串的基本操作
- 数据结构之二叉树的基本操作
- 数据结构之栈的基本操作
- 数据结构之链表的基本操作
- 数据结构之一般树的基本操作
- 数据结构之栈的基本操作
- 数据结构之树的基本操作
- 数据结构查找之-单链表的基本操作
- 数据结构之单链表的基本操作
- 数据结构之树的一些基本操作
- 数据结构之单链表基本操作
- 数据结构之单链表基本操作
- 数据结构之图的邻接表的基本操作
- 数据结构笔记之链式栈的基本操作
- 数据结构之线性表中顺序表的基本操作
- 老城里斯本简介
- HDU 3255 Farming(线段树求体积并)
- 解决Firefox 27中AutoProxy不能订阅代理规则的方法
- 番外:菜鸟如何读优秀 JS 开源项目之“2048”
- 链表的基本操作
- 数据结构之双链表的基本操作
- linux系统下安装samba,和简单网络配置 .
- LabVIEW上位机与串口通信
- 各种排序算法时间复杂度
- 低功耗蓝牙的基础
- Source Insight 3.X utf8支持插件
- cookie相关
- Partition List
- Qt应用程序自动重启