1)在任意条多段线的指定结点位置处插入一个新的结点;
2)从多段线中,删除任意一个指定的结点;
3)按照结点的序号,快速查询该结点的坐标、左右结点的信息。
#include <iostream>
using namespace std;
typedef struct tagPointNode
{
double x;
double y;
long id;
tagPointNode* leftPointNodePtr;
tagPointNode* rightPointNodePtr;
}PointNode, * PointNodePtr;
bool PointNodeinit(PointNode*& L)
{
L = new PointNode;
if (!L)
return true;
cout << "生成结点失败!" << endl;
L->rightPointNodePtr = nullptr;
L->leftPointNodePtr = nullptr;
L->x = 0.0;
L->y = 0.0;
L->id = -1;
return true;
}
PointNodePtr CreatList(int n) //创建链表
{
PointNode* head = new PointNode;
cout << "请输入头结点的x" << endl;
cin >> head->x;
cout << "请输入头结点的y" << endl;
cin >> head->y;
cout << "请输入头结点的id" << endl;
cin >> head->id;
head->leftPointNodePtr = nullptr;
head->rightPointNodePtr = nullptr;
PointNode* ptemp = head;
for (int i = 1; i <= n-1; i++)
{
PointNode* pNewNode = new PointNode;
cout << "请输入该结点的x" << endl;
cin >> pNewNode->x;
cout << "请输入该结点的y" << endl;
cin >> pNewNode->y;
cout << "请输入该结点的id" << endl;
cin >> pNewNode->id;
pNewNode->rightPointNodePtr = NULL;
ptemp->rightPointNodePtr = pNewNode;
pNewNode->leftPointNodePtr = ptemp;
ptemp = ptemp->rightPointNodePtr;
}
return head;
}
void Insert(PointNode* head, int a) //插入结点
{
PointNodePtr p = head;
PointNode* s = new PointNode;
cout << "请输入该结点的x" << endl;
cin >> s->x;
cout << "请输入该结点的y" << endl;
cin >> s->y;
cout << "请输入该结点的id" << endl;
cin >> s->id;
while (p != NULL && p->id != a)
p = p->rightPointNodePtr;
if (p != NULL)
{
s->rightPointNodePtr = p->rightPointNodePtr;
p->rightPointNodePtr->leftPointNodePtr = s;
s->leftPointNodePtr = p;
p->rightPointNodePtr = s;
}
else
cout << "插入的位置不存在";
}
void Delete(PointNode* head, int b) //删除结点
{
PointNodePtr p = head;
while (p != NULL && p->id != b)
p = p->rightPointNodePtr;
if (p != NULL)
{
p->leftPointNodePtr->rightPointNodePtr = p->rightPointNodePtr;
p->rightPointNodePtr->leftPointNodePtr = p->leftPointNodePtr;
delete p;
}
else
cout << "没找到,不能删除!";
}
void Find(PointNode* head,int c) //查找信息
{
PointNodePtr p = head;
while (p != NULL && p->id != c)
p = p->rightPointNodePtr;
if (p != NULL)
{
cout << "该结点的坐标为" << "(" << p->x << "," << p->y << ")" << endl;
cout << "其左结点信息" << p->leftPointNodePtr->id << endl;
cout << "其右结点信息" << p->rightPointNodePtr->id << endl;
}
}
void print(PointNode* head) //输出链表
{
PointNodePtr p = head;
while (p != NULL)
{
cout << p->x << p->y << p->id << endl;
p = p->rightPointNodePtr;
}
}
int main()
{
int a, b, c, n;
cout << "请输入结点个数" << endl;
cin >> n;
PointNodePtr h= CreatList(n);
print(h);
cout << "请输入要插入的位置" << endl;
cin >> a;
Insert(h, a);
print(h);
cout << "请输入要查询的点的位置" << endl;
cin >> c;
Find(h, c);
cout << "请输入要删除的结点" << endl;
cin >> b;
Delete(h, b);
print(h);
return 0;
}