C++编程:实现单链表操作

需积分: 30 13 下载量 183 浏览量 更新于2024-09-09 3 收藏 16KB DOCX 举报
"这篇文档是关于使用C++实现单链表的数据结构,包括链表的创建、显示、长度计算、查找、插入、删除和反转等基本操作。" 在计算机科学中,链表是一种线性数据结构,其中的元素不是在内存中连续存储的。单链表是链表的一种,每个节点包含数据部分和一个指向下一个节点的指针。在C++中,我们可以使用类来表示链表节点和链表本身。 首先,定义一个`CNode`类,它有两个成员:`data`用于存储数据,`next`是一个指向下一个节点的指针。`CNode`类还包括一个构造函数,用于初始化`next`指针为`NULL`。 接着,定义`CList`类来管理单链表。`CList`类包含一个私有成员`head`,它是一个`CNode`类型的指针,用于指向链表的第一个节点。类中还包括一系列公共成员函数: 1. 构造函数`CList()`:创建一个空链表,`head`指向一个新的空节点,其`next`指针为`NULL`。 2. `Create()`函数:用户输入数据,创建链表。此函数通过不断读取用户输入并创建新节点,将新节点链接到链表的末尾。 3. `Display()`函数:打印链表中的所有元素。 4. 析构函数`~CList()`:当`CList`对象被销毁时,释放链表的所有节点,防止内存泄漏。 5. `getlen()`函数:返回链表的长度,通过遍历链表计算节点数量。 6. `isEmpty()`函数:检查链表是否为空,如果`head->next`为`NULL`,则链表为空。 7. `Find()`函数:查找链表中是否存在指定值的节点。 8. `GetNode()`函数:根据索引获取链表中的节点(注意,索引从0开始)。 9. `Insert()`函数:在指定位置插入一个新节点。 10. `Delete()`函数:删除具有指定值的节点。 11. `Reverse()`函数:反转链表。 这些成员函数的实现涉及了链表操作的核心概念,如遍历链表、改变节点的链接关系以及动态内存分配。例如,`Insert()`函数需要找到插入位置,创建新节点,然后更新前后节点的链接关系。`Delete()`函数则需要找到待删除节点,修改前后节点的链接,并释放不再需要的内存。 这个C++实现的单链表提供了链表的基本操作,可以作为理解链表数据结构和C++面向对象编程的一个实例。通过这个实现,我们可以学习如何在实际编程中有效地管理和操作链表。
2010-05-03 上传
#include using namespace std; const int MaxSize=100; template //模板类 class SeqList { public: SeqList() {length=0;} //无参构造函数 SeqList(T a[],int n); //有参构造函数 ~SeqList(){} //析构函数 int Length() {return length;} //求线性表长度 T Get(int i); //按位查找 int Locate(T x); //按值查找 void Insert (int i, T x); // 插入函数 T Delete(int i); //删除函数 void PrintList(); //遍历线性表,按序号依次输出各个元素。 private: T data[MaxSize]; int length; }; template SeqList::SeqList(T a[],int n) //有参构造函数 { if(n>MaxSize)throw"参数非法"; for(int i=0;i<n;i++) data[i]=a[i]; length=n; } template void SeqList::Insert(int i,T x) //插入函数 { if (length>=MaxSize) throw "上溢"; if(ilength+1) throw "位置异常"; for (int j=length;j>=i;j--) data[j]=data[j-1]; data[i-1]=x; length++; } template T SeqList::Get(int i) //按位查找函数 { if(ilength) throw "查找位置非法"; else return data[i-1]; } template int SeqList::Locate(T x) //按值查找函数 { for (int i=0;i<length;i++) if (data[i]==x)return i+1; return 0; } template T SeqList::Delete(int i) //删除函数 { if (int length=0)throw "下溢"; if(ilength)throw "位置异常"; T x=data[i-1]; for(int j=i;j<length;j++) data[j-1]=data[j]; length--; return x; } template void SeqList::PrintList() // 遍历线性表 { for (int i=0;i<length;i++) cout<<data[i]<<" "; cout<<endl; } void menu() { cout<<" 欢迎,欢迎!"<<endl; cout<<" 1.插入查询"<<endl; cout<<" 2.删除函数"<<endl; cout<<" 3.求表长"<<endl; cout<<" 4.按值查找"<<endl; cout<<" 5.按位查找"<<endl; cout<<" 6.遍历线性表"<<endl; cout<<" 7.退出"<<endl; cout<<" "<<endl; cout<<" 请选择编号:"<<endl; } int main() { int i,j,x; int a[7]={12,15,24,56,67,68,86}; SeqList s1(a,7); int flag=1; while(flag) { menu(); cin>>j; switch(j) { case 1: { try { cout<<"显示要插入的位序及数值:"<>i>>x; cout<<endl; s1.Insert(i,x); s1.PrintList(); } catch (char *s){cout<<s<<endl;} }; break; case 2: { try { cout<>i; x=s1.Delete(i); cout<<"已删除:"<<x<<endl; cout<<"删除数据后表变为:"<<endl; s1.PrintList(); } catch (char *s){cout<<s<<endl;} }; break; case 3: { try { s1.Length(); cout<<"线性表长度为:"<<s1.Length()<<endl; } catch(char *s){cout<<s<<endl;} }; break; case 4: { try { cout<<"输入查找数据x:"<>x; s1.Locate(x); cout<<"所查数据在第"<<s1.Locate(x)<<"位"<<endl; } catch(char *s){cout<<s<<endl;} }; break; case 5: { try { cout<>i; s1.Get(i); cout<<"该位置元素为:"<<s1.Get(i)<<endl; } catch(char *s){cout<<s<<endl;} }; break; case 6: { try { s1.PrintList(); } catch(char *s){cout<<s<<endl;} }; break; case 7: flag=0; break; default:cout<<"错误!!!"<<endl; break; } } return 0; }