最佳答案

//链表的操作编辑

//线性表的双向链表存储结构

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语言程序完整版的,借鉴一下思想,再多说一下就是能运行的那种...相关推荐

  1. php array_flip() 删除数组重复元素——大彻大悟

    1. php array_flip() 删除数组重复元素,如果用于一维索引数组,好理解. [root@BG-DB:~]$more arr.php  <?php $arr = array('a', ...

  2. 真心求一个有pi控制的基于28335的dsp程序

    真心求一个有pi控制的基于28335的dsp程序 我知道pwm的编程,但是怎么加一个pi来稳定,28335中不知道怎么写,真心求一个文件

  3. 用c语言实现单链表的初始化,建表,查找,求长度,插入,删除等操作,【YTU+2430+C语言习题+链表建立+插入+删除+输(5)...

    的打印.判断链表是否为空.计算链表长度.插入节点.删除节点.删除整个链表.(2) 线性表adt顺序存储实现中的创建.查找.插入和删除等基本操作及相关算法,线性表adt链式存储实现中单链表.循环链表和双 ...

  4. 前端面试高频题:删除数组重复元素的多种方法

    最近在想着换工作,去了一家中关村的上市公司,面试官随便问了几个问题其中就提到了怎么删除数组元素的方法,表示这已经是第三次遇到了这个问题了,由于知识口头说说所以就随便说了下,之前用的时候都是直接找的方法 ...

  5. c语言如何求一个数学表达式的值,浅谈C语言中表达式的求值

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言研究性学习的路线 现行的多数C语言教材有太多的误区,不仅不能给读者提供有效的学习线索,还常常"误导"读者,于是,"死记 ...

  6. 求一个矩阵中的马鞍点(c语言实现)

    数据结构中的求一个矩阵的马鞍点 请编写一个完整的程序,如果矩阵A中存在这样的一个元素A[i,j]满足条件A[i,j]是第i行的值最小的元素,且又是第j列中最大的元素,则称之为该矩阵的一个马鞍点. 代码 ...

  7. 数据结构-求一个字符串中的某个子串(C语言)

    文章目录 题目描述: 代码实例: 题目描述: 返回顺序串s中从第i(1<i<n)个字符开始的连续j个字符组成的子串.当参数不正确时返回一个空串 代码实例: #include<stdi ...

  8. C语言链表怎么合并同类项,求一个关于合并同类项的编程

    求一个关于合并同类项的编程 全并同类项的程序,谢谢 搜索更多相关的解决方案: 同类项 ----------------解决方案------------------------------------- ...

  9. c语言删除数组重复元素并升序,C语言编程题: 编写函数,从一个已经排序的数组中删去某数后,该数组仍然有序....

    满意答案 nanhrui57q 2014.01.10 采纳率:57%    等级:12 已帮助:8634人 #include #include int compear(void *, void *); ...

最新文章

  1. 二次开发photoshop_Photoshop 101:Web开发人员简介
  2. asp创建mysql表_创建一个数据库,用ASP怎么写?
  3. python下三角代码分析_空间分析:2-3。用Python生成Delaunay三角形,23Python,德劳内
  4. libpcap介绍(一)
  5. Python基本语法(基于3.x)
  6. qtmessagebox对话框里自定义按钮文本_按钮你可以这样设计
  7. 铺磁砖,给定M*N的格子,用u*v的瓷砖去铺满,有多少种铺法
  8. 第 8 天 多线程与多进程
  9. 四种进程或线程同步互斥的控制方法
  10. 手把手教你强化学习 (六) 强化学习中的无模型预测
  11. [备忘]java读取与写入文件的五种方式
  12. 存储ic载板_【行业亮点】看好载板供不应求趋势,深南/兴森/越亚积极布局
  13. 联合索引(a,b,c),怎么单独检索b用上索引
  14. 6G概念及愿景白皮书
  15. 信息收集总结(基本信息搜集思路)
  16. 【ASP.NET】第十课——网站的配制与部署
  17. Tryhackme-Web Hacking Fundamentals
  18. 动态修改 DHTML Gantt甘特图皮肤样式
  19. Alice和Bob的故事---非对称加密
  20. 【正点原子Linux连载】第四十四章 设备树下的LED驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

热门文章

  1. this全面解析, 如何定位this指向,一文总结,再也不怕面试官追问啦
  2. angular封装富文本编辑器指令
  3. HTTP状态码415 springboot项目
  4. python3生成二维码实例fromm_Python使用mqtt极简例子
  5. 使用说明_预拌混凝土使用说明
  6. IOS – OpenGL ES 调节图像色彩替换 GPUImageFalseColorFilter
  7. C语言 va_start / va_end / va_arg 自定义 printf 函数 - C语言零基础入门教程
  8. Python 线程定时器 Timer - Python零基础入门教程
  9. lambda 流 peek java_JDK8 流与λ表达式
  10. java解压zip异常_java解压zip文件示例