c语言:双向循环链表的实现

来源:互联网 发布:电驴mac下载软件 编辑:程序博客网 时间:2024/05/23 18:33
// 双向循环链表实现.cpp : 定义控制台应用程序的入口点。#include<iostream>#include<stdio.h>#include<math.h>#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 0
原创粉丝点击