双向循环链表涉及双向指针的基本操作(C语言)

时间:2024-04-18 17:35:25

  链表大概分为有无头指针,有无尾指针,是否循环,单向还是双向,

这些都很简单,前提是你要把指针和单链表理解透彻。这些都是基于单链表

的变形,要根据实际问题,选择链表的类型。

  头指针的指针域储存着储存头节点的地址,其数据域我们不使用。

尾指针同理。

  循环链表的最后一个节点指向头节点(如果有头指针,则是指向头指针),

非循环链表的最后一个节点指向NUll。

  单向链表只有一个指针域,且指向下一个节点地址,

而双向链表有两个指针域,一个指向该节点的上一个节点地址,

另一个指向该节点的下一个节点地址。  

  构建链表节点:

 #define ElemType int //链表元素类型

 //线性表的双向链表储存结构
typedef struct DuLNode {
ElemType data; //数据域
struct DuLNode *prior; //前驱指针域
struct DuLNode *next; //后继指针域 }DuLNode;

  如果d为指向链表中某一个节点的指针  则显然满足

d->next->prior=d->prior->next=d
//d->next 表示d的上一个节点
//d->next->prior 表示d的上一个节点的下一个节点 即d本身
//-_-!有点绕啊

  双向循环链表中有一些操作只需要一个方向的指针,比如计算链表长度(这里全局变量iCount即为长度),

查找元素,返回元素位置等等(这些我都不想写 请原谅我的懒-_-)  ,当然涉及两个方向的指针我都会贴出来的。

  

 #include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define ElemType int //链表元素类型
int iCount; // 定义全局变量 表示链表长度
//线性表的双向链表储存结构
typedef struct DuLNode {
ElemType data; //数据域
struct DuLNode *prior; //前驱指针域
struct DuLNode *next; //后继指针域 }DuLNode;
//创建链表
DuLNode *CreateDuLNode() {
DuLNode *pHead , *pEnd, *pNew;
//头指针的初始化
pHead=(DuLNode*)malloc(sizeof(DuLNode));
pHead->prior = NULL;
pHead->next = NULL;
if (!pHead) exit(); pNew = pEnd = (DuLNode*)malloc(sizeof(DuLNode));
if (!pNew) exit();
scanf("%d", &pNew->data);
while (pNew->data != ) //读取到0结束
{
iCount++;
if (iCount == )
{
pNew->prior= pHead;
pNew->next = NULL;
pHead->next = pNew;
pEnd = pNew; }
else
{
pNew->prior = pEnd;
pNew->next = NULL;
pEnd->next = pNew;
pEnd = pNew;
}
pNew = (DuLNode*)malloc(sizeof(DuLNode));
if (!pNew) exit();
scanf("%d", &pNew->data); }
free(pNew); //释放多余的空间
pHead->prior = pEnd; //形成
pEnd->next = pHead; // 双循环
return pHead;
}
//插入节点
int DuLInsert(DuLNode *p, int i, DuLNode *s) {
/*在带头指针的的双链循环线性表p中的第i个位置
之前插入节点s,i的合法值为1<=i<=表长(头指针不算长度)+1
i取最小值头插,i取最大值尾插*/
DuLNode *q;
if (i< || i>iCount + ) //i的值不合法
return ERROR; if (i == iCount + ) //在p中确定第i个元素的位置 指针q
q = p;
else
for (q = p; i > ; i--)
q = q->next;
//先插入 后修改 防止断链
q->prior->next = s;
s->prior = q->prior;
q->prior = s;
s->next = q; return OK;
}
//删除第i个节点,并用e返回删除值
int DuLDelete(DuLNode *p, int i, ElemType *e) {
/*在带头指针的的双链循环线性表p中的第i个位置
之前插入节点s,i的合法值为1<=i<=表长(头指针不算长度)+1
i取最小值头删,i取最大值尾删*/
DuLNode *q;
if (i< || i>iCount + ) //i的值不合法
return ERROR; //在p中确定第i个元素的位置 指针q
for (q = p; i > ; i--)
q = q->next; *e = q->data;
q->prior->next = q->next;
q->next->prior = q->prior;
free(q); return OK;
}