您的位置:首页 > 编程语言 > C语言/C++

c++实现链表的基本操作

2017-09-17 16:58 459 查看
学习数据结构课程时所写,本人代码能力有限,如有不妥,欢迎指点


#include <iostream>
using namespace std;
#define NO_FOUND 1
struct Node
{
int data; // 数据类型可以改变,此程序中以int为例子
Node* next;
};
typedef Node* List_Node;
class List
{
public:
List();
~List();
int getLength(); // 返回链表总结点个数
void Init_List(); // 创建新链表
void Print_List(); // 遍历输出链表
List_Node GetNode(int i); // 返回第i个结点
void Delete_Node(int i); // 删除第i个结点
void Insert_Node(int x, int i); // 在链表的第i个结点之前插入值为x的元素
int Locate_Elem(int e); // 查找数据e所在结点的位置,从1开始
private:
List_Node head;
};
List::List()
{
head = NULL;
}
void List::Init_List()
{
List_Node p, q;

p = new Node;
q = p;
cout << "请输入几个数据(以-1表示结束):"<<endl;
cin >> p->data;
while (p->data != -1)
{
if (head == NULL)
head = p;
else
q->next = p;

q = p;
p = new Node;
/*cout << "请输入数据(以-1表示结束):" << endl;*/
cin >> p->data;
}
q->next = NULL;
delete p;
}
void List::Print_List()
{
cout << "所有数据如下:" << endl;
List_Node p=head;
while (p)
{
cout<<p->data<<" ";
p = p->next;
}
}
List_Node List::GetNode(int i)
{
List_Node p = head;
int j = 1; // 标记head结点位置值为1
while (p && j < i)
{
p = p->next;
j++;
}
if (!p||j>i) // 当p为空或i=0时
return NULL;
return p;
}
void List::Delete_Node(int i)
{
if (i == 1) //当删除头结点时
{
head = head->next;
return;
}
List_Node p = GetNode(i-1);
List_Node q = p->next;
p->next = q->next;
delete q;
}
void List::Insert_Node(int x, int i)
{
if (i == 1) // 在链表头部插一个结点
{
List_Node t = new Node;
t->data = x;
t->next = head;
head = t;
}
else
{
List_Node p = GetNode(i-1); // 找到第i个结点的前驱
List_Node temp = new Node;
temp->data = x;
temp->next = p->next;
p->next = temp;
}

}
List::~List()
{
List_Node p=head;
while (p)
{
head = p->next;
delete p;
p = head;
}

}
int List::Locate_Elem(int e)
{
List_Node p = head;
int pos = 1;
while (p != NULL)
{
if (p->data == e)
return pos;
else
{
p = p->next;
pos++;
}
}
return NO_FOUND;
}
int List::getLength()
{
int cnt = 0;
List_Node p = head;
while (p != NULL)
{
cnt++;
p = p->next;
}
return cnt;
}

int main()
{
List l;
l.Init_List();
l.Print_List();
cout <<endl<< "你要删除第几个结点?" << endl;
int i;
cin >> i;
if (i > l.getLength()||i<1)
cout << "删除失败!" << endl;
else
{
l.Delete_Node(i);
l.Print_List();
}

cout << endl<<"请输入想要插入元素的值和插入的位置:";
int x,pos;
cin >> x>>pos;
l.Insert_Node(x, pos);
l.Print_List();

cout << endl << "请输入想要查找元素的值:";
int t;
cin >> t;
if (l.Locate_Elem(t) == NO_FOUND)
cout << "不存在这个元素" << endl;
else
cout << "该元素在链表中处于第" << l.Locate_Elem(t) << "个" << endl;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: