c语言循环正向输出链表,c语言:双向循环链表的实现

// 双向循环链表实现.cpp : 定义控制台应用程序的入口点。

#include

#include

#include

#define LEN sizeof(struct DSCriculist)

using namespace std;

typedef struct DSCriculist //定义结构体

{

int data; //数据域

struct DSCriculist *prior;//前向指针域

struct DSCriculist *next; //后向指针域

}DSCriculist;

//函数声明部分

void Error(char* s);//错误处理函数

DSCriculist *Creat_DSCriculist(); //创建双向循环链表

DSCriculist *Find_DSCriculist(DSCriculist & L, int i);//查找双向循环链表中第i个结点

void Insert_DSCriculist(DSCriculist & L, int i, int e);//向双向循环链表中位置i处插入数据域为e的结点

void Delete_DSCriculist(DSCriculist & L, int i, int e);//删除双向循环链表中第i个结点,并用e返回该结点数据域的值

void Search_DSCriculist(DSCriculist &L, int e);//查找双向循环链表中数据域为e的结点,并输出

int Getlength_DSCriculist(DSCriculist & L);//计算上相循环链表的长度

void Print_DSCriculist(DSCriculist &L);//以此输出双向循环链表的数据域的值

//函数定义部分

void Error(char *s) //错误处理函数

{

cout << s << endl;

exit(1);

}

DSCriculist *Creat_DSCriculist()

{

DSCriculist *head, *tail, *ptr;

int length = 0;

int number = 0;

head = (struct DSCriculist*)malloc(LEN);

if (NULL == head)

Error("内存分配失败!");

head->data = 0;

head->next = head;

head->prior = head;

tail = head;

cout << "请输入链表长度:";

cin >> length;

cout << "请输入链表数据:" << endl;

for (int i = 0; i < length; i++)

{

ptr = (struct DSCriculist*)malloc(LEN);

if (NULL == ptr)

Error("内存分配失败!");

cin >> number;

ptr->data = number;

tail->next = ptr;

ptr->prior = tail;

ptr->next = head;

head->prior = ptr;

tail = ptr;

}

cout << "双向链表创建成功!" << endl;

return head;

}

DSCriculist *Find_DSCriculist(DSCriculist & L, int i)

{

DSCriculist *prev = L.next;

int j = 1;

while ((prev != &L) && (j < i))

{

prev = prev->next;

j++;

}

return prev;

}

void Insert_DSCriculist(DSCriculist & L, int i, int e)

{

DSCriculist *prev = Find_DSCriculist(L, i);

DSCriculist *ptr = (struct DSCriculist*)malloc(LEN);

if (NULL == ptr)

Error("内存分配失败!");

ptr->data = e;

prev->prior->next = ptr;

ptr->next = prev;

prev->prior = ptr;

ptr->prior = prev->prior;

}

void Delete_DSCriculist(DSCriculist & L, int i, int e)//删除双向循环链表中第i个结点,并用e返回该结点数据域的值

{

DSCriculist *prev = Find_DSCriculist(L, i);

e = prev->data;

if (prev->next == &L)

{

DSCriculist *pt = prev->prior;

pt->next = &L;

}

else

{

prev->prior->next = prev->next;

prev->next->prior = prev->prior;

}

cout << "删除的元素是:" << e << endl;;

delete prev;

}

void Search_DSCriculist(DSCriculist &L, int e)//查找双向循环链表中数据域为e的结点,并输出该节点的位置

{

DSCriculist *prev = L.next;

if (prev == &L)

Error("位置错误!");

int k = 1;

while ((prev->next != &L) && (prev->data != e))

{

prev = prev->next;

k++;

}

cout << "该元素在链表中的位置是:" << k << endl;

}

int Getlength_DSCriculist(DSCriculist & L)

{

DSCriculist *prev = &L;

int length = 0;

while (prev->next != &L)

{

prev = prev->next;

length++;

}

return length;

}

void Print_DSCriculist(DSCriculist &L)

{

DSCriculist *prev = L.next;

if (prev == &L)

Error("该链表为空表!");

cout << "该链表数据是:" << endl;

while (prev->next!= &L)

{

cout << prev->data << " ";

prev = prev->next;

}

cout << endl;

}

int main()

{

DSCriculist *p = NULL;

int m, n, t, q;

int e = 0;

p = Creat_DSCriculist();

Print_DSCriculist(*p);

cout << "该链表的长度是:" << Getlength_DSCriculist(*p) << endl;

cout << "请输入你要插入的位置:";

cin >> m;

cout << "请输入你要插入的元素:";

cin >> n;

Insert_DSCriculist(*p, m, n);

Print_DSCriculist(*p);

cout << "插入后的链表的长度是:" << Getlength_DSCriculist(*p) << endl;

cout << "请输入你要删除的位置:";

cin >> q;

Delete_DSCriculist(*p, q, e);

Print_DSCriculist(*p);

cout << "删除后的链表的长度是:" << Getlength_DSCriculist(*p) << endl;

cout << "请输入要查找的元素:";

cin >> t;

Search_DSCriculist(*p, t);

return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值