c语言代码实现
C语言实现 线性表(双向循环链表)的相关操作,实现了如下方法:
- 在双向循环链表指定位置插入元素
DoubleLinkListInsert(DoubleLinkList &L, int i, ElemType e); - 删除双向循环链表指定位置的元素
DoubleLinkListDelete(DoubleLinkList &L, int i, ElemType &e);
写的匆忙,如有错误,请大家指正一下。
#include <stdio.h>
#include <cstdlib>
//###一些常量
//函数结果状态码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//链表最大容量
#define MAXSIZE 100
//函数类型
typedef int Status;
//单链表的元素类型
typedef char ElemType;
//定义双向循环链表的结构体
typedef struct DoubleLinkListNode{
//链表的数据域
ElemType data;
//上一节点指针域
struct DoubleLinkListNode *prior;
//下一节点指针域
struct DoubleLinkListNode *next;
}DoubleLinkListNode, *DoubleLinkList;
//在双向循环链表指定位置插入元素
Status DoubleLinkListInsert(DoubleLinkList &L, int i, ElemType e);
//删除双向循环链表指定位置的元素
Status DoubleLinkListDelete(DoubleLinkList &L, int i, ElemType &e);
int main(){
}
/**
* 在双向循环链表指定位置插入元素
* @param L 双向循环链表
* @param i 第几个位置
* @param e 元素
* @return
*/
Status DoubleLinkListInsert(DoubleLinkList &L, int i, ElemType e){
//指向首元节点
DoubleLinkListNode *p = L->next;
for(int k=1; k<=i; k++, p++){
//没到指定位置,跳过本次循环
if(k != i) continue;
//创建新结点
DoubleLinkListNode *newNode = new DoubleLinkListNode;
newNode->data = e;
//插入
//新结点的前驱指针域指向第i个结点的前驱的地址
newNode->prior = p->prior;
//第i-1个结点的next指针域指向新建的结点
p->prior->next = newNode;
//第i个结点的前驱指针域指向新建结点
p->prior = newNode;
//新建结点的next指针域指向第i个元素,完成插入
newNode->next = p;
return OK;
}
printf("插入失败!");
return ERROR;
}
/**
* 删除双向循环链表指定位置的元素
* @param L 双向循环链表
* @param i 要删除第几个位置的元素
* @param e 用来接收被删除的元素
* @return
*/
Status DoubleLinkListDelete(DoubleLinkList &L, int i, ElemType &e){
//指向首元节点
DoubleLinkListNode *p = L->next;
for(int k=1; k<=i; k++, p++){
//没到指定位置,跳过本次循环
if(k != i) continue;
//删除
//删除结点的前一个结点的next指针域指向删除结点的后一个结点
p->prior->next = p->next;
//删除结点的后一个结点的prior指针域指向删除结点的前一个结点
p->next->prior = p->prior;
//释放当前结点
delete p;
return OK;
}
printf("删除失败!");
return ERROR;
}