简介
使用C++面向对象方法,自定义链表类,实现链表对象的增删改查。
具体实现
思路:构造节点结构体,成员为链表首位节点指针,将成员和增删改查方法封装在一起
结构体
typedef struct chain
{
int data;
struct chain* next;
}chain;
链表类框架
class Chain_table
{
private:
chain* head = new chain(); //头指针
chain* tail; //尾指针
public:
Chain_table() //构造函数
{
head->next = NULL;
head->data = 0;
tail = head;
}
~Chain_table() //析构函数
{
chain* p = head->next;
while (p != NULL)
{
delete head;
head = p;
p = head->next;
}
delete head;
}
int getval(int val) const; //返回val在链表中出现的次数;
chain* getpos(int val,chain* pos) const; //从pos位置查找val并返回地址
void add_data(int val); //在末尾加入一个值为val的数据
void del_data(int val); //删除第一个值为val的数据
void modify_data(int val,int val1); //将第一个值为val的数据修改为val1
void show_table() const;
};
添加方法
void Chain_table::add_data(int val)
{
chain* p = new chain();
p->data = val;
p->next = NULL; //新建节点
tail->next = p; //添加到尾部
tail = p; //尾指针后移
}
显示方法
void Chain_table::show_table() const
{
chain* p = head->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
返回查找数的地址
chain* Chain_table::getpos(int val,chain* pos) const
{
chain* p = pos->next;
while (p != NULL)
{
if (p->data == val) break;
else p = p->next;
}
return p;
}
修改方法
void Chain_table::modify_data(int val,int val1)
{
chain* p = getpos(val, head); //查找地址,直接修改
if (p != NULL)
{
p->data = val1;
cout << "修改成功" << endl;
}
else cout << "表中没有值为" << val << "的数据" << endl;
}
统计个数
int Chain_table::getval(int val) const
{
int count = 0;
chain* p = head;
while ((p = getpos(val, p)) != NULL) //查找到一次,count加一,从当前位置继续查找
{
count++;
}
return count;
}
删除方法
void Chain_table::del_data(int val)
{
chain* p = head;
chain* q = p->next;
while (q != NULL)
{
if (val == q->data)
{
if (tail == q) tail = p; //要删除的是尾指针,尾指针前移
p->next = q->next; //删除节点并释放空间
delete q;
return;
}
else
{
p = q;
q = p->next;
}
}
cout << "删除失败,表中没有值为" << val << "的数据" << endl;
}
调用及测试
int main()
{
Chain_table ch_t;
for (int i = 0; i < 10; i++) ch_t.add_data(i);
ch_t.show_table();
ch_t.modify_data(2, 3);
ch_t.show_table();
cout << "表中3的个数为" << ch_t.getval(3) << endl;
ch_t.del_data(3);
ch_t.show_table();
return 0;
}
测试结果:
ps:被链表折磨了,暂时不想完善了。粗略的写一下,应该还存在很多不足,仅供参考,希望大家都能写出0error,0worning,0bug的代码。