C++实现链表基本操作

前几天找实习的时候,一个面试官给我留了一个题,做一个链表demo,要求实现创建、插入、删除等操作。

链表是一种常见的数据结构,它是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

我是用C++代码来写的。首先,定义一个linklist.h文件,该文件定义了链表的结点和链表支持的方法。如下所示:

 

//linklist.h:定义链表结点和方法。
#include <string>
using namespace std;

struct Info
{
	string name;	//姓名
	int id;		//学号
};
//链表定义
struct Node
{
	Info val;
	Node *next;
	Node(Info x):val(x),next(NULL) {}
};

class LinkList
{
public:
	//构造函数
	LinkList();	
	//在链表头部插入结点
	void InsertHead(Info val);
	//插入结点
	void Insert(Info val,int pos);
	//删除结点
	void Remove(Info val);
	//得到链表长度
	int Length();
	//链表反序
	void Reverse();
	//查找结点位置
	int Find(Info val);
	//打印链表
	void Print();
	//析构函数
	~LinkList();
private:
	Node *head;
	int length;
};

 

然后,定义一个linklist.cpp文件,是链表方法的实现。如下所示:

//linklist.cpp:链表方法的实现。
 #include "stdafx.h"
#include <iostream>
#include "linklist.h"
using namespace std;

//构造函数
LinkList::LinkList()
{
	head = NULL;
	length = 0;
}

//析构函数
LinkList::~LinkList()
{
	Node *temp;
	for(int i=0;i<length;i++)
	{
		temp=head;
		head=head->next;
		delete temp;
	}
}

//得到链表长度
int LinkList::Length()
{
	return length;
}

//在链表头部插入结点
void LinkList::InsertHead(Info val)
{
	Insert(val,0);
}

//插入结点
void LinkList::Insert(Info val,int pos)
{
	if(pos<0)
	{
		cout<<"pos must be greater than zero"<<endl;
		return;
	}
	int index = 1;
	Node *temp = head;
	Node *node = new Node(val);
	if(pos == 0)
	{
		node->next = temp;
		head = node;
		length++;
		return;
	}
	while(temp!=NULL && index<pos)
	{
		temp=temp->next;
		index++;
	}
	if(temp == NULL)
	{
		cout<<"Insert failed"<<endl;
		return;
	}
	node->next = temp->next;
	temp->next = node;
	length++;
}

//删除结点
void LinkList::Remove(Info val)
{
	int pos = Find(val);
	if(pos == -1)
	{
		cout<<"Delete failed"<<endl;
		return;
	}
	if(pos == 1)
	{
		head = head->next;
		length--;
		return;
	}
	int index = 2;
	Node *temp = head;
	while(index < pos)
		temp = temp->next;
	temp->next = temp->next->next;
	length--;
}

//查找结点位置
int LinkList::Find(Info val)
{
	Node *temp = head;
	int index = 1;
	while(temp!=NULL)
	{
		if(temp->val.name == val.name && temp->val.id == val.id)
			return index;
		temp = temp->next;
		index ++;
	}
	return -1; //不存在返回-1
}

//链表反序
void LinkList::Reverse()
{
	if(head==NULL)
        return;
    Node *curNode=head,*nextNode=head->next,*temp;
    while(nextNode!=NULL)
	{
        temp=nextNode->next;
        nextNode->next=curNode;
        curNode=nextNode;
        nextNode=temp;
    }
    head->next=NULL;
    head=curNode;
}

//打印链表
void LinkList::Print()
{
	if(head == NULL)
	{
		cout<<"LinkList is empty"<<endl;
		return;
	}
	Node *temp = head;
	while(temp!=NULL)
	{
		cout<<temp->val.name<<","<<temp->val.id<<endl;
		temp=temp->next;
	}
	cout<<endl;
}

最后,定义一个main.cpp,用来测试链表功能,如下所示:

// main.cpp : 测试链表功能。
#include "stdafx.h"
#include <iostream>
#include <string>
#include "linklist.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	LinkList head;
	Info val1,val2,val3,val4;
	val1.id =1,val1.name="Kevin",val2.id=2,val2.name="Cathy",val3.id=3,val3.name="Lucy",val4.id=4,val4.name="Gravin";
	
	//测试插入功能
	cout<<"Insert test:"<<endl;
	head.InsertHead(val1);
	head.Print();
	head.Insert(val2,1);
	head.Print();
	head.Insert(val3,4);
	head.Print();
	head.InsertHead(val3);
	head.Insert(val4,2);
	head.Print();
	
	//测试反序功能
	cout<<"reverse test:"<<endl;
	head.Reverse();
	cout<<"reversed linklist is:"<<endl;
	head.Print();
	
	//测试删除功能
	cout<<"remove test:"<<endl;
	cout<<"the length of linklist is:"<<endl;
	cout<<head.Length()<<endl;
	head.Remove(val4);
	head.Print();
	cout<<"the length of linklist is:"<<endl;
	cout<<head.Length()<<endl;
	head.Remove(val4);
	head.Print();
	return 0;
}

测试结果如下图:




 

链表是一种常见的数据结构,它可以动态地存储数据,可以方便地插入和删除节点。链表由一个个节点组成,每个节点包含数据和指向下一个节点的指针。 以下是C++实现链表的基础操作: 1. 定义节点结构体 ```cpp struct Node { int data; Node* next; }; ``` 2. 创建链表 ```cpp Node* createList(int n) { Node* head = nullptr; Node* tail = nullptr; for (int i = 0; i < n; i++) { Node* newNode = new Node(); cin >> newNode->data; newNode->next = nullptr; if (head == nullptr) { head = newNode; tail = newNode; } else { tail->next = newNode; tail = newNode; } } return head; } ``` 3. 遍历链表 ```cpp void traverseList(Node* head) { Node* p = head; while (p != nullptr) { cout << p->data << " "; p = p->next; } cout << endl; } ``` 4. 插入节点 ```cpp void insertNode(Node*& head, int pos, int val) { Node* newNode = new Node(); newNode->data = val; newNode->next = nullptr; if (head == nullptr) { head = newNode; return; } if (pos == 0) { newNode->next = head; head = newNode; return; } Node* p = head; int i = 0; while (p != nullptr && i < pos - 1) { p = p->next; i++; } if (p == nullptr) { cout << "Invalid position" << endl; return; } newNode->next = p->next; p->next = newNode; } ``` 5. 删除节点 ```cpp void deleteNode(Node*& head, int pos) { if (head == nullptr) { cout << "Empty list" << endl; return; } if (pos == 0) { Node* temp = head; head = head->next; delete temp; return; } Node* p = head; int i = 0; while (p != nullptr && i < pos - 1) { p = p->next; i++; } if (p == nullptr || p->next == nullptr) { cout << "Invalid position" << endl; return; } Node* temp = p->next; p->next = temp->next; delete temp; } ``` 6. 查找节点 ```cpp int searchNode(Node* head, int val) { Node* p = head; int i = 0; while (p != nullptr) { if (p->data == val) { return i; } p = p->next; i++; } return -1; } ``` 7. 获取链表长度 ```cpp int getListLength(Node* head) { int len = 0; Node* p = head; while (p != nullptr) { len++; p = p->next; } return len; } ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值