C++创建单链表,完整代码

本文介绍了一种使用C++实现单链表的方法,并提供了包括插入、删除、查找等基本操作在内的完整代码示例。通过具体的应用实例展示了单链表的操作流程。

前端时间搜了下创建单链表,发现全是些片段,创完我都不知道如何声明!!

气煞我也,下面是我自己的代码,包括对单链表的增删查改操作,以及应用实例。

#include <iostream>
using namespace std;
template <class DataType>
struct Node
{
	 DataType data;
	 Node<DataType> *next;                 //结点类 
};
template <class DataType>
class LinkList
{   
public:
     LinkList( );                          //新建空表 
     LinkList(DataType a[ ], int n);       //链表赋值 
     ~LinkList( ); 						   //析构函数 
     int Length( );          			   //计算长度 
     DataType Get(int i);           	   //按位查找 
     int Locate(DataType x);       		   //按值查找 
     void Insert(int i, DataType x);       //插入操作 
     DataType Delete(int i);        	   //删除操作 
     void PrintList( );           		   //遍历操作 
private:
     Node<DataType> *first; 			
};
template <class DataType>
void LinkList<DataType> :: PrintList( )
{
     Node<DataType> *p = first->next; 
     while (p != NULL)
     {
         cout << p->data;
         p = p->next;   
     }
     cout<<endl; 
}
template <class DataType>
int LinkList<DataType> :: Length( )
{
     Node<DataType> *p = first->next;int count = 0;     
     while (p != NULL)
     {
         p = p->next;
         count++;
     }
     return count;     //注意count的初始化和返回值之间的关系
}
template <class DataType>  
int LinkList<DataType> :: Locate(DataType x) 
{
     Node<DataType> *p = first->next;
	 int count = 1;         
    while (p != NULL)    
    {
        if (p->data == x) return count;     //查找成功,返回序号
        p = p->next;                   
        count++;
    }
    return 0;                                          //退出循环表明查找失败
}
template <class DataType>  
 void LinkList<DataType> :: Insert(int i, DataType x)
 {
	  Node<DataType> *p = first ,*s;
	  int count = 0;                		//工作指针p应指向头结点
      while (p != NULL && count < i - 1)     //查找第i – 1个结点
     {
          p = p->next;                   
          count++;
     }
     if (p == NULL) throw "位置";      //没有找到第i – 1个结点
    else { 
        s = new Node<DataType>;  s->data = x;         //申请一个结点s
        s->next = p->next; p->next = s;   //结点s插入结点p之后
    }
 }
template <class DataType>  
DataType LinkList<DataType> :: Get(int i)
{
	 Node<DataType> *p=first->next;int count=1;
	 while (p!=NULL && count<i)
	 {
	 	 p=p->next;
	 	 count++;
	 }
	 if(p == NULL)throw "位置";
	 else return p->data; 
}
template <class DataType>  
LinkList<DataType> :: LinkList(DataType a[ ], int n)
{
     Node<DataType> *r,*s;
 	 first = new Node<DataType>;                 	 //生成头结点
     r = first;                         //尾指针初始化
    for (int i = 0; i < n; i++)
    { 
        s = new Node<DataType>; s->data = a[i];        
        r->next = s; r = s;                 
    }
     r->next = NULL;        
}
template <class DataType>  
LinkList<DataType> :: LinkList()
{
	 first=new Node<DataType>;                 	//生成头结点
	 first->next=NULL;				  //头节点的指针域置空 
}
template <class DataType>  
DataType LinkList<DataType> :: Delete(int i)
{
     Node<DataType> *p,*q;
     DataType x;
	 p = first ;int count = 0;            
     while (p != NULL && count < i - 1)
     {
         p = p->next;
         count++;
     }
     if (p == NULL || p->next == NULL)  throw "位置"; 
     else {
         q = p->next; x = q->data;         
         p->next = q->next;              
         delete q; return x;
     }
}
template <class DataType>
LinkList<DataType> :: ~LinkList( )
{	 Node<DataType> *q;
     while (first != NULL)
     {
         q = first;                 
         first = first->next;         
         delete q;    
     }
}
int main(){
	int a[5]={11,22,33,44,55}; 
	LinkList <int> L(a,5);
	cout<<"插入前数据:";L.PrintList();
	cout<<"第二位数据的值:";cout<<L.Get(2);cout<<endl;
	cout<<"11对应的序号:";cout<<L.Locate(11);cout<<endl;
	try
	 {
		L.Insert(1,66);
	 }
	catch(char *s)
	 {
	 	cout<<s<<endl;
	 }
	cout<<"插入后的数据:";L.PrintList();
	try
	 {
		L.Delete(5);
	 }
	catch(char *s)
	 {
	 	cout<<s<<endl;
	 }
	cout<<"删除后的数据:";L.PrintList();
	cout<<"数组长度:";cout<<L.Length();
	return 0;
}

<think>好的,用户想要用C++实现单链表代码示例。首先,我需要回忆单链表的基本结构和操作。单链表由节点组成,每个节点包含数据和指向下一个节点的指针。常见的操作包括插入、删除、遍历等。 接下来,我需要确定用户的需求层次。用户可能是一个刚学数据结构的新手,需要清晰的代码示例和解释。因此,代码应该结构简单,注释详细,并且包含基本操作的实现,比如插入头部、删除节点、打印链表等。 然后,考虑C++的实现方式。使用结构体或类来定义节点,这里可能用struct更方便。链表类应该包含头节点指针,以及相关的成员函数。需要注意内存管理,特别是在删除节点时,要释放内存,避免泄漏。 可能会遇到的问题包括指针操作错误,比如在插入或删除时没有正确更新next指针。此外,遍历链表时的循环条件也需要小心处理,避免空指针访问。 用户还可能希望代码示例包含测试用例,这样他们可以看到实际运行效果。因此,在main函数中创建链表实例,调用各个方法,并输出结果是有必要的。 最后,需要检查代码是否符合C++标准,比如使用nullptr而不是NULL,以及适当的访问修饰符(public/private)。确保代码编译通过,并且逻辑正确。 现在,将这些思考整合成一个结构清晰的代码示例,并附上解释,帮助用户理解每个部分的作用。同时,生成相关问题,帮助用户进一步学习链表的相关知识。</think>### C++ 单链表实现代码示例 以下是用C++实现单链表完整代码,包含基础操作和详细注释: ```cpp #include <iostream> using namespace std; // 定义链表节点结构体 struct Node { int data; // 节点数据 Node* next; // 指向下一个节点的指针 Node(int val) : data(val), next(nullptr) {} // 构造函数 }; class LinkedList { private: Node* head; // 头节点指针 public: LinkedList() : head(nullptr) {} // 初始化链表为空 // 在链表头部插入新节点 void insertAtHead(int val) { Node* newNode = new Node(val); newNode->next = head; head = newNode; } // 删除第一个匹配值的节点 bool deleteNode(int val) { Node* current = head; Node* prev = nullptr; while (current) { if (current->data == val) { if (prev) { prev->next = current->next; } else { head = current->next; } delete current; return true; } prev = current; current = current->next; } return false; } // 遍历打印链表 void display() { Node* temp = head; while (temp) { cout << temp->data << " -> "; temp = temp->next; } cout << "NULL" << endl; } // 析构函数释放内存 ~LinkedList() { Node* current = head; while (current) { Node* next = current->next; delete current; current = next; } } }; int main() { LinkedList list; // 插入测试 list.insertAtHead(3); list.insertAtHead(2); list.insertAtHead(1); cout << "初始链表: "; list.display(); // 输出: 1 -> 2 -> 3 -> NULL // 删除测试 list.deleteNode(2); cout << "删除后: "; list.display(); // 输出: 1 -> 3 -> NULL return 0; } ``` 关键实现要点: 1. 节点使用`struct`定义,包含数据域和指针域 2. 链表类封装插入、删除、遍历等基础操作 3. 使用动态内存分配,注意在析构函数中释放内存[^2] 4. 时间复杂度分析: - 头部插入:$O(1)$ - 删除操作:$O(n)$ - 遍历显示:$O(n)$
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gavana.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值