typedef int ElemType;
struct NodeType
{
ElemType data; //数据域
NodeType *next; //指针域 存放本结构体类型结点的首地址
};
class LinkList
{
private:
NodeType *Head;
public:
LinkList(); //构造函数
~LinkList(); //析构函数
void create(); //创建一个非空链表
void Display(); //显示链表的元素
void insert(int i, ElemType x); //在第i个结点插入插入元素
void insert2(ElemType x, ElemType y); //在数据域为x的结点前插入数据域为y的结点
ElemType delet(int i); //删除第i个结点的元素并返回该元素
void delet2(ElemType x); //删除表中值为x的元素并输出yes, 否则输出no
void reverse(); //单链表的逆置
};
LinkList::LinkList()
{
Head = new NodeType;
Head->next = NULL;
Head->data = 0;
cout << "\n init" << endl;
}
//析构
LinkList::~LinkList()
{
NodeType *p;
p = Head->next; //指向链表中第一个数据结点
while (p != NULL)
{
Head->next = p->next;
delete p;
p = Head->next;
}
}
//创建非空链表
void LinkList::create()
{
NodeType *s;
ElemType x;
cout << "\n 请按倒序输入数据,以-999为结束标志。" << endl;
cout << "\n data = ?"; cin >> x; //先输入最后一个元素
while (x != -999)
{
s = new NodeType;
s->data = x; //给当前结点的数据域赋值
s->next = Head->next; //使s指向头结点指向的节点
Head->next = s; //将s放在头结点的后面 /每次都放在Head的后面
cout << "\n data = ?"; cin >> x;
}
cout << "\n 插入结束,链表生成" << endl;
}
void LinkList::Display()
{
NodeType *p;
p = Head->next; //p指向第一个结点
while (p != NULL)
{
cout << p->data << " "; //输出第一个结点的数据
p = p->next; //指向第二个结点
}
cout << endl;
}
void LinkList::insert(int i, ElemType x)
{
NodeType *p, *q, *s;
int k = 1; //不算头结点 从第一个结点开始查找
q = Head;
p = Head->next;
while (k<i&&p!=NULL) //当K<i 并且p不为空时执行 p为空时说明前一次p已经指向了最后一个结点
{
q = p;
p = p->next;
k++;
}
if (k == i)
{
s = new NodeType;
s->data = x;
q->next = s;
s->next = p;
cout << "\n 插入成功,在第"<<i<<"个位置插入了数据域为"<<x<<"的结点" << endl;
}
else
cout << "\n i<1或i太大,不存在" << endl;
cout << "\n 插入结束" << endl;
}
ElemType LinkList:: delet(int i)
{
NodeType *p, *q, *s;
ElemType x;
int k = 1;
q = Head; //q指向头结点
p = Head->next; //p指向第一个结点
while (k < i&&p != NULL)
{
q = p; //q指向p
p = p->next; //p指向p的后继结点
k++;
}
//循后得到第i个值
if (p != NULL)
{
x = p->data; //得到第i个结点的数据域
q->next = p->next; //q指向p的后继结点
delete p; //删除p
cout << "\n 结点删除成功 删除了第"<<i<<"个结点" << endl;
}
else
{
cout << "\n i<1或太大,i不存在" << endl;
x = -1;
}
return x;
}
void LinkList::insert2(ElemType x, ElemType y)
{
NodeType *p, *q, *s;
s = new NodeType;
s->data = y;
q = Head;
p = Head->next;
while (p!=NULL&&p->data != x)
{
q = p;
p = p->next;
}
if (p == NULL)
cout << "\n 不存数据域为" << x << "的结点。 在表尾插入。" << endl;
q->next = s;
s->next = p;
cout << "\n 向链表中插入了数据域为" << y << "的元素。" << endl;
}
void LinkList::delet2(ElemType x)
{
NodeType *q, *p;
q = Head;
p = Head->next;
while (p!=NULL&&p->data != x)
{
q = p;
p = p->next;
}
if (p == NULL)
cout << " \n No!" << endl;
else
{
q->next = p->next;
delete p;
cout << " \n Yes!" << endl;
}
}
void LinkList::reverse()
{
NodeType *h, *p, *q;
h = Head; //h指向头结点
p = h->next; //p指向第一个结点
h->next = NULL; //断开头结点与后面的链接
while (p != NULL)
{
q = p->next; //q指向p的后继结点
p->next = h->next; //断开p与q的链接 使p指向头结点指向的结点
h->next = p; //头结点断开原来的链接 指向p
p = q; //将p和q指向相同的结点 即上次循环中p的下一个结点
}
}
int main()
{
LinkList h;
h.create();
h.Display();
h.insert(5, 3);
h.Display();
h.insert2(25, 26);
h.Display();
h.delet(3);
h.Display();
h.delet2(25);
h.Display();
h.reverse();
h.Display();
std::cout << "Hello World!\n";
}
指针变量的一些主要操作