#include"stdio.h"
#include"malloc.h"
typedef struct DNode
{
int data;
DNode *prior, *next;
}DNode;
void InitDNode(DNode *&p)
{
p = (DNode *)malloc(sizeof(DNode));
p->prior = NULL;
p->next = p;
}
void createDNode(DNode *p)
{
int n;
DNode *r,*q;
r = p;
printf("Input data, input -1 to end: ");
scanf("%d",&n);
while(n != -1)
{
q = (DNode *)malloc(sizeof(DNode));
q->next = q->prior = NULL;
q->data = n;
r->next = q;
q->prior = r;
r = q;
scanf("%d",&n);
}
}
void display(DNode *p)
{
DNode *r;
r = p->next;
printf("The List: ");
while(r != NULL)
{
printf("%d ",r->data);
r = r->next;
}
printf("\n");
}
int lengthDNode(DNode *p)
{
DNode *r;
int n = 0;
r = p->next;
while(r->next != NULL)
{
++n;
r = r->next;
}
return n;
}
int InsertDNode(DNode *p, int position, int x)
{
if(position<=0 || position >lengthDNode(p)+1)
{
printf("The position is not suitable!\n");
return 0;
}
DNode *q, *r;
q = (DNode *)malloc(sizeof(DNode));
q->data = x;
q->next=q->prior = NULL;
int n = 1;
r = p->next;
while(n!= position-1)
{
r = r->next;
++n;
}
q->prior = r;
q->next = r->next;
r->next->prior = q;
r->next = q;
return 1;
}
void InvertDisplay(DNode *p)
{
DNode *r;
r = p->next;
while(r->next != NULL)
{
r = r->next;
}
printf("InverseList: ");
while(r->prior!=NULL)
{
printf("%d ",r->data);
r = r->prior;
}
printf("\n");
}
int DeleteDNode(DNode *p, int position, int &x)
{
DNode *r,*q;
if(position<=0 || position> lengthDNode(p)+1)
{
printf("The position is not suitable!\n");
x = -1;
return 0;
}
r = p->next;
int n=1;
while(n != position-1)
{
r = r->next;
++n;
}
q = r->next;
x = q->data;
r->next = q->next;
q->next->prior = r;
free(q);
return 1;
}
void main()
{
DNode *p;
InitDNode(p);
createDNode(p);
display(p);
InsertDNode(p,2,9);
display(p);
InvertDisplay(p);
int x;
DeleteDNode(p,2,x);
printf("The delete DNode is %d\n",x);
display(p);
}
分享到:
相关推荐
C++实现的带头结点的双向循环链表, 数据结构课设.。
用C++和Java实现带头节点的双向循环链表,要继承linearList类,并实现它的所有功能,另外,必须实现双向迭代器。 实现带头节点的双向循环链表,要具有以下的功能: 判断表是否为空,如果为空则返回true,不空返回...
链表 链表_使用C语言实现非循环双向链表_带头结点+尾结点
C语言实现带头结点尾结点的双向非循环链表的基本操作 C语言实现带头结点尾结点的双向非循环链表的基本操作 C语言实现带头结点尾结点的双向非循环链表的基本操作
数据结构-基本算法-不带头结点的循环链表(学生时代源码,调试可运行)
利用双向循环链表来实现对长整数的存储。每个节点只存储四位十进制数字。选择该数据结构来完成长整数的加减运算是因为要对长整数进行运算,需要对长整数进行存储,所以选择用链表对长整数存储,又由于存储的顺序是从...
节点类双向头结点循环链表
if(head->next==head)//链表里就有一个节点并且为头结点 { if (head->cardnum==del->cardnum) { free(head); head = NULL; } else { printf("in mydel error\n"); } } else//链表里有超过一个的节点 {...
5.1带头结点的链表 5.2循环链表 5.3 双向链表 5.4 线性表的应用示例
带头结点的链表、循环链表和双向链表的特征,基本运算。 对于循环链表要突出掌握判断链表空满的条件; 双向链表要强调插入和删除算法的实现。 最后通过多项式加法的示例,介绍线性表的应用。 预期目标: 我希望大家...
●建立一个带头结点的空双向链表;●指定插入位置及元素值到双向链表中;●随机插入5个元素到双向链表的尾部;●指定删除元素位置(从1开始),从双向链表中删除;●输入查找值,得到元素在双向链表中位置;●清空...
用双向循环链表解决约瑟夫环问题的程序清单
我们使用一种比较特殊的链表——非循环双向链表来实现队列。首先这里的说明的是构建的是普通的队列,而不是循环队列。当我们使用数组的时候创建循环队列是为了节省存储空间,而来到链表中时,每一个节点都是动态申请...
建立一个带头结点的空双向链表 逐步演示插入指定元素值至指定位置 逐步演示随机插入 3 个节点至双向链表的尾部 逐步演示从双向链表中指定删除节点的位置进行删除 逐步演示输入查找值得到元素在双向链表中的位置...
此压缩包为1、无头+单向+非循环链表增删查改实现// 动态申请一个结点// 单链表打印// 单链表尾插// 单链表的头插// 单链表的尾删// 单链表头删// 单链表查找// 单链表在pos位置之后插入x// 单链表删除pos位置之后的...
3、假设以带头结点的循环链表表示队列,并只设一个指针指向队尾,编写相应的置队空、入队和出队算法。 要求:掌握栈和队列的数据结构的特点;熟练掌握在两种存储结构上实现栈和队列的基本运算;学会利用栈和队列解决...
在双向链表中,每个结点有两个指针域,一个指向 结点的直接后继,另一个指向 结点的直接前驱。 6.设有一个非空的链栈,栈顶指针为hs,要进行出栈操作,用x保存出栈结点的值,栈 结点的指针域为next,数据域为data,...
带头结点双链循环线性表,通过该程序可以学习双向链表的使用
◎ 实验题目: 合并两个链表 ◎ 实验目的:熟悉顺序表和指针的用法,并能用于具体问题 ◎ 实验内容:将两个链表合并为一个带头结点的有序循环链表
6.在双向链表指针p的结点前插入一个指针q的结点操作是( )。 A. p->Llink=q;q->Rlink=p;p->Llink->Rlink=q;q->Llink=q; B. p->Llink=q;p->Llink->Rlink=q;q->Rlink=p;q->Llink=p->Llink; C. q->Rlink=p;q->Llink=...