c语言删除双向链表重复元素,求一个双向链表的建立,插入删除的c语言程序完整版的,借鉴一下思想,再多说一下就是能运行的那种...
最佳答案
//链表的操作编辑
//线性表的双向链表存储结构
typedef struct DuLNode
{
ElemType data;
struct DuLNode *prior,*next;
}DuLNode,*DuLinkList;
//
//带头结点的双向循环链表的基本操作
void InitList(DuLinkList L)
{ /* 产生空的双向循环链表L */
L=(DuLinkList)malloc(sizeof(DuLNode));
if(L)
L->next=L->prior=L;
else
exit(OVERFLOW);
}
//
//销毁双向循环链表L
void DestroyList(DuLinkList L)
{
DuLinkList q,p=(*L)->next; /* p指向第一个结点 */
while(p!=*L) /* p没到表头 */
{
q=p->next;
free(p);
p=q;
}
free(*L);
*L=NULL;
}
//
//重置链表为空表
void ClearList(DuLinkList L) /* 不改变L */
{
DuLinkList q,p=L->next; /* p指向第一个结点 */
while(p!=L) /* p没到表头 */
{
q=p->next;
free(p);
p=q;
}
L->next=L->prior=L; /*头结点的两个指针域均指向自身 */
}
//
//验证是否为空表
Status ListEmpty(DuLinkList L)
{ /* 初始条件:线性表L已存在
if(L->next==L&&L->prior==L)
return TRUE;
else
return FALSE;
}
//
//元素的操作编辑
//计算表内元素个数
int ListLength(DuLinkList L)
{ /* 初始条件:L已存在。操作结果: */
int i=0;
DuLinkList p=L->next; /* p指向第一个结点 */
while(p!=L) /* p没到表头 */
{
i++;
p=p->next;
}
return i;
}
//
//赋值
Status GetElem(DuLinkList L,int i,ElemType *e)
{ /* 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */
int j=1; /* j为计数器 */
DuLinkList p=L->next; /* p指向第一个结点 */
while(p!=L&&j
{
p=p->next;
j++;
}
if(p==L||j>i) /* 第i个元素不存在 */
return ERROR;
*e=p->data; /* 取第i个元素 */
return OK;
}
//
//查找元素
int LocateElem(DuLinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{ /* 初始条件:L已存在,compare()是数据元素判定函数 */
/* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int i=0;
DuLinkList p=L->next; /* p指向第1个元素 */
while(p!=L)
{
i++;
if(compare(p->data,e)) /* 找到这样的数据元素*/
return i;
p=p->next;
}
return 0;
}
//
//查找元素前驱
Status PriorElem(DuLinkList L,ElemType cur_e,ElemType *pre_e)
{ /* 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱, */
/* 否则操作失败,pre_e无定义 */
DuLinkList p=L->next->next; /* p指向第2个元素 */
while(p!=L) /* p没到表头 */
{
if(p->data==cur_e)
{
*pre_e=p->prior->data;
return TRUE;
}
p=p->next;
}
return FALSE;
}
//
//查找元素后继
Status NextElem(DuLinkList L,ElemType cur_e,ElemType *next_e)
{ /* 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继, */
/* 否则操作失败,next_e无定义 */
DuLinkList p=L->next->next; /* p指向第2个元素 */
while(p!=L) /* p没到表头 */
{
if(p->prior->data==cur_e)
{
*next_e=p->data;
return TRUE;
}
p=p->next;
}
return FALSE;
}
//
//查找元素地址
DuLinkList GetElemP(DuLinkList L,int i) /* 另加 */
{ /* 在双向链表L中返回第i个元素的地址。i为0,返回头结点的地址。若第i个元素不存在,*/
/* 返回NULL */
int j;
DuLinkList p=L; /* p指向头结点 */
if(i<0||i>ListLength(L)) /* i值不合法 */
return NULL;
for(j=1;j<=i;j++)
p=p->next;
return p;
}
//
//元素的插入
Status ListInsert(DuLinkList L,int i,ElemType e)
{ /* 在带头结点的双链循环线性表L中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1 */
/* 改进算法2.18,否则无法在第表长+1个结点之前插入元素 */
DuLinkList p,s;
if(i<1||i>ListLength(L)+1) /* i值不合法 */
return ERROR;
p=GetElemP(L,i-1); /* 在L中确定第i个元素前驱的位置指针p */
if(!p) /* p=NULL,即第i个元素的前驱不存在(设头结点为第1个元素的前驱) */
return ERROR;
s=(DuLinkList)malloc(sizeof(DuLNode));
if(!s)
return OVERFLOW;
s->data=e;
s->prior=p; /* 在第i-1个元素之后插入 */
s->next=p->next;
p->next->prior=s;
p->next=s;
return OK;
}
//
//元素的删除
Status ListDelete(DuLinkList L,int i,ElemType *e)
{ /* 删除带头结点的双链循环线性表L的第i个元素,i的合法值为1≤i≤表长 */
DuLinkList p;
if(i<1) /* i值不合法 */
return ERROR;
p=GetElemP(L,i); /* 在L中确定第i个元素的位置指针p */
if(!p) /* p=NULL,即第i个元素不存在 */
return ERROR;
*e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return OK;
}
//
//正序查找
void ListTraverse(DuLinkList L,void(*visit)(ElemType))
{ /* 由双链循环线性表L的头结点出发,正序对每个数据元素调用函数visit() */
DuLinkList p=L->next; /* p指向头结点 */
while(p!=L)
{
visit(p->data);
p=p->next;
}
printf("\n");
}
//
//逆序查找
void ListTraverseBack(DuLinkList L,void(*visit)(ElemType))
{ /* 由双链循环线性表L的头结点出发,逆序对每个数据元素调用函数visit()。另加 */
DuLinkList p=L->prior; /* p指向尾结点 */
while(p!=L)
{
visit(p->data);
p=p->prior;
}
printf("\n");
}
追问:
可执行,谢谢
最佳答案由网友 jariii 提供
c语言删除双向链表重复元素,求一个双向链表的建立,插入删除的c语言程序完整版的,借鉴一下思想,再多说一下就是能运行的那种...相关推荐
- php array_flip() 删除数组重复元素——大彻大悟
1. php array_flip() 删除数组重复元素,如果用于一维索引数组,好理解. [root@BG-DB:~]$more arr.php <?php $arr = array('a', ...
- 真心求一个有pi控制的基于28335的dsp程序
真心求一个有pi控制的基于28335的dsp程序 我知道pwm的编程,但是怎么加一个pi来稳定,28335中不知道怎么写,真心求一个文件
- 用c语言实现单链表的初始化,建表,查找,求长度,插入,删除等操作,【YTU+2430+C语言习题+链表建立+插入+删除+输(5)...
的打印.判断链表是否为空.计算链表长度.插入节点.删除节点.删除整个链表.(2) 线性表adt顺序存储实现中的创建.查找.插入和删除等基本操作及相关算法,线性表adt链式存储实现中单链表.循环链表和双 ...
- 前端面试高频题:删除数组重复元素的多种方法
最近在想着换工作,去了一家中关村的上市公司,面试官随便问了几个问题其中就提到了怎么删除数组元素的方法,表示这已经是第三次遇到了这个问题了,由于知识口头说说所以就随便说了下,之前用的时候都是直接找的方法 ...
- c语言如何求一个数学表达式的值,浅谈C语言中表达式的求值
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言研究性学习的路线 现行的多数C语言教材有太多的误区,不仅不能给读者提供有效的学习线索,还常常"误导"读者,于是,"死记 ...
- 求一个矩阵中的马鞍点(c语言实现)
数据结构中的求一个矩阵的马鞍点 请编写一个完整的程序,如果矩阵A中存在这样的一个元素A[i,j]满足条件A[i,j]是第i行的值最小的元素,且又是第j列中最大的元素,则称之为该矩阵的一个马鞍点. 代码 ...
- 数据结构-求一个字符串中的某个子串(C语言)
文章目录 题目描述: 代码实例: 题目描述: 返回顺序串s中从第i(1<i<n)个字符开始的连续j个字符组成的子串.当参数不正确时返回一个空串 代码实例: #include<stdi ...
- C语言链表怎么合并同类项,求一个关于合并同类项的编程
求一个关于合并同类项的编程 全并同类项的程序,谢谢 搜索更多相关的解决方案: 同类项 ----------------解决方案------------------------------------- ...
- c语言删除数组重复元素并升序,C语言编程题: 编写函数,从一个已经排序的数组中删去某数后,该数组仍然有序....
满意答案 nanhrui57q 2014.01.10 采纳率:57% 等级:12 已帮助:8634人 #include #include int compear(void *, void *); ...
最新文章
- 二次开发photoshop_Photoshop 101:Web开发人员简介
- asp创建mysql表_创建一个数据库,用ASP怎么写?
- python下三角代码分析_空间分析:2-3。用Python生成Delaunay三角形,23Python,德劳内
- libpcap介绍(一)
- Python基本语法(基于3.x)
- qtmessagebox对话框里自定义按钮文本_按钮你可以这样设计
- 铺磁砖,给定M*N的格子,用u*v的瓷砖去铺满,有多少种铺法
- 第 8 天 多线程与多进程
- 四种进程或线程同步互斥的控制方法
- 手把手教你强化学习 (六) 强化学习中的无模型预测
- [备忘]java读取与写入文件的五种方式
- 存储ic载板_【行业亮点】看好载板供不应求趋势,深南/兴森/越亚积极布局
- 联合索引(a,b,c),怎么单独检索b用上索引
- 6G概念及愿景白皮书
- 信息收集总结(基本信息搜集思路)
- 【ASP.NET】第十课——网站的配制与部署
- Tryhackme-Web Hacking Fundamentals
- 动态修改 DHTML Gantt甘特图皮肤样式
- Alice和Bob的故事---非对称加密
- 【正点原子Linux连载】第四十四章 设备树下的LED驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
热门文章
- this全面解析, 如何定位this指向,一文总结,再也不怕面试官追问啦
- angular封装富文本编辑器指令
- HTTP状态码415 springboot项目
- python3生成二维码实例fromm_Python使用mqtt极简例子
- 使用说明_预拌混凝土使用说明
- IOS – OpenGL ES 调节图像色彩替换 GPUImageFalseColorFilter
- C语言 va_start / va_end / va_arg 自定义 printf 函数 - C语言零基础入门教程
- Python 线程定时器 Timer - Python零基础入门教程
- lambda 流 peek java_JDK8 流与λ表达式
- java解压zip异常_java解压zip文件示例