#include<iostream>
#include<stdio.h>
#include<math.h>
#define LEN sizeof(struct DNodelist)
using namespace std;
typedef struct DNodelist //定義結構體
{
int data; //結點資料域
struct DNodelist *prior;//結點前向指標
struct DNodelist *next; //節點后向指標
}DNodelist;
//函式宣告部分
void Error(char *s); // 錯誤處理函式
DNodelist *Creat_DNodelist(void); //創建雙向鏈表函式
void Insert_DNodelist(DNodelist &l, int i, int e); //向雙鏈表中第i個結點插入元素e
void Delete_DNodelist(DNodelist &l, int i, int e); //洗掉鏈表中第i個結點的元素,并用e回傳
int GetLength_DNodelist(DNodelist l); //雙向鏈表的長度
void FreeMemory_DNodelist(DNodelist *l); //釋放雙向鏈表
DNodelist *Find_DNodelist(DNodelist &l, int i); //查找鏈表中第i個結點,并回傳該結點的指標
void Modly_DNodelist(DNodelist &l, int e); //查找雙向鏈表中資料域為e的元素的結點,并將給位置輸出
void Print_DNodelist(DNodelist &l); //顯示雙向鏈表中的資料域中的元素
//函式撰寫部分
void Error(char *s)
{
cout << s << endl;
exit(1);
}
DNodelist *Creat_DNodelist(void)
{
int i, length = 0, data = 0;
DNodelist *Tail = NULL;
DNodelist *pnew = NULL;
DNodelist *head = (DNodelist *)malloc(LEN);
if (NULL == head)
Error("位置錯誤!");
head->data = 0;
head->prior = NULL;
head->next = NULL;
Tail = head;
cout << "請輸入想要創建鏈表的長度:";
cin >> length;
for (i = 1; i<length + 1; i++)
{
pnew = (DNodelist *)malloc(LEN);
if (NULL == pnew)
Error("位置錯誤!");
cin >> data;
pnew->data = data;
pnew->next = NULL;
pnew->prior = Tail;
Tail->next = pnew;
Tail = pnew;
}
return head;
}
int GetLength_DNodelist(DNodelist l)
{
int length = 0;
DNodelist *pt = l.next;
while (pt != NULL)
{
length++;
pt = pt->next;
}
return length;
}
DNodelist *Find_DNodelist(DNodelist &l, int i)
{
DNodelist *prev = &l;
if (prev == NULL)
Error("位置錯誤!");
int j = 1;
while ((prev->next != NULL) || (j < i))
{
prev = prev->next;
j++;
}
if ((prev->next == NULL) || (j > i))
return NULL;
else
return prev;
}
void Insert_DNodelist(DNodelist &l, int i, int e)
{
DNodelist *prev = Find_DNodelist(l, i);
DNodelist *ptr = (struct DNodelist *)malloc(LEN);
ptr->data = e;
prev->prior->next = ptr;
ptr->prior = prev->prior;
ptr->next = prev;
prev->prior = ptr;
}
void Delete_DNodelist(DNodelist &l, int i, int e)
{
DNodelist *prev = Find_DNodelist(l, i);
e = prev->data;
prev->prior->next = prev->next;
prev->next->prior = prev->prior;
cout << "洗掉的元素是:" << e;
delete prev;
}
void Modly_DNodelist(DNodelist &l, int e)
{
DNodelist *prev = l.next;
if (prev == NULL)
Error("位置錯誤!");
int k = 1;
while ((prev->next != NULL) && (prev->data != e))
{
prev = prev->next;
k++;
}
cout << "元素e在鏈表中的位置是:" << k << endl;
}
void Print_DNodelist(DNodelist &l)
{
DNodelist *prev = l.next;
if (prev == NULL)
Error("該鏈表為空表!");
while (prev != NULL)
{
cout << prev->data << " ";
prev = prev->next;
}
cout << endl;
}
void FreeMemory_DNodelist(DNodelist *l)
{
DNodelist *pt = NULL;
while (l!= NULL)
{
pt = l->next;
free(l);
if (NULL != pt)
pt->prior = NULL;
l= pt;
}
}
/*void Print_DNodelist(DNodelist *l)
{
DNodelist *prev = l->next->next->next;
if (prev == NULL)
Error("該鏈表為空表!");
while (prev->prior != NULL)
{
cout << prev->data << " ";
prev = prev->prior;
}
cout << endl;
}*/
int main()
{
DNodelist *p = NULL;
int m, n, t, q;
int e = 0;
p = Creat_DNodelist();
Print_DNodelist(*p);
cout << "請輸入你要插入的位置:";
cin >> m;
cout << "請輸入你要插入的元素:";
cin >> n;
Insert_DNodelist(*p, m, n);
cout << "插入后的鏈表資料是:";
Print_DNodelist(*p);
/*cout << "請輸入你要洗掉的位置:";
cin >> q;
Delete_DNodelist(*p, q, e);
cout << "洗掉后的鏈表資料是:";
Print_DNodelist(*p);
cout << "請輸入要查找的元素:";
cin >> t;
Modly_DNodelist(*p, t);*/
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/80987.html
標籤:基礎類
