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

来源:互联网 发布:淘宝古董钟表 编辑:程序博客网 时间:2024/06/05 10:58

学习数据结构课程时所写,本人代码能力有限,如有不妥,欢迎指点吐舌头


#include <iostream>using namespace std;#define NO_FOUND 1struct 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;elseq->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结点位置值为1while (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;elsecout << "该元素在链表中处于第" << l.Locate_Elem(t) << "个" << endl;}


原创粉丝点击