第1关:双链表练习
编写一个具有(x,y)坐标点所组成的双链表。
1.双链表的建立,2.双链表的删除, 3.双链表插入,与单链表略有差异,但思路基本相同
#include<iostream>
#include<string>
#include<fstream>
#include<iomanip>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
struct Point
{
int x;//ISBN
int y;//书名
};
typedef struct DuLNode
{
Point data; //数据域
struct DuLNode *prior; //直接前驱
struct DuLNode *next; //直接后继
} DuLNode, *DuLinkList;
int length;
Status InitDuList_L(DuLinkList &L)
{
//构造一个空的双向链表L
/********************************Begin******************************/
L = new DuLNode;
if(!L) return ERROR;
L -> prior = NULL,L -> next = NULL;
return OK;
/*********************************End**************************/
}
DuLNode *GetElemP_DuL(DuLinkList L, int i)
{
//在带头结点的双向链表L中查找第i个元素,返回结点的地址
/********************************Begin******************************/
DuLinkList p = L;
int k = 0;
while(p && k < i)
{
p = p -> next;
k ++ ;
}
if(k == i && p) return p;
return NULL;
/*********************************End**************************/
} //GetElemP_DuL
Status ListInsert_DuL(DuLinkList &L, int i, Point e)
{ //算法2.13 双向链表的插入
//在带头结点的双向链表L中第i个位置之前插入元素e,i的合法值为1<=i<=表长+1
/********************************Begin******************************/
DuLinkList p = GetElemP_DuL(L,i);
if(!p) return ERROR;
DuLinkList t = new DuLNode;
t -> data = e;
t -> next = p;
t -> prior = p -> prior;
p -> prior -> next = t;
p -> prior = t;
return OK;
/*********************************End**************************/
} //ListInsert_DuL
Status ListDelete_DuL(DuLinkList &L, int i)
{ //算法2.14 双向链表的删除
//删除带头结点的双向链表L中第i个位置之前插入元素e,i的合法值为1<=i<=表长
/********************************Begin******************************/
int k = 0;
DuLinkList p = L;
while(p && k < i)
{
p = p -> next;
k ++ ;
}
p -> prior -> next = p -> next;
delete p;
/*********************************End**************************/
}//ListDelete_DuL
void CreateDuList_L(DuLinkList &L, int m)
{
//正位序输入n个元素的值,建立带表头结点的双向链表L,同时建立前驱指针
/********************************Begin******************************/
DuLinkList p = L;
while(m -- )
{
DuLinkList t = new DuLNode;
cin >> t -> data.x >> t -> data.y;
t -> next = NULL;
t -> prior = p;
p -> next = t;
p = t;
}
/*********************************End**************************/
} //CreateDuList_L
int main()
{
int a, choose;
char op;
Point e;
DuLinkList L, p;
cin >> choose;
while (choose --)
{
cin >> op;
switch (op)
{
case 'I': //建立一个双向链表
if (InitDuList_L(L))
break;
case 'C': //使用后插法创建双向链表
int n;
cin >> n;
CreateDuList_L(L, n);
break;
case 'S': //双向链表的插入
cin >> a;
cin >> e.x >> e.y;
ListInsert_DuL(L, a, e);
break;
case 'D': //双向链表的删除
cin >> a;
ListDelete_DuL(L, a);
break;
}
}
//双向链表的输出
p = L->next;
while (p)
{
cout << p->data.x << ' ' << p->data.y << endl;
p = p->next;
}
return 0;
}