【C++编程基础】 #001 链表操作:创建、删除、得到链表长度、指定位置的值、反转、插入、输出等。

问题描述

链表是C++中比较有特色的一种数据结构,同时思想较为简单,用处也比较多。然而,实现单链表却是很多C++初学者比较头疼的一件事,本文撰写了一些单链表的基本操作,主要包括:

  1. 创建链表(正序)
  2. 创建链表(逆序)
  3. 输出链表内容
  4. 删除指定位置的链表结点
  5. 删除指定值的链表结点
  6. 得到链表长度
  7. 链表反转
  8. 判断两个链表是否相等
  9. 在指定位置插入链表的新结点

小伙伴们需要自取,有帮助的话可以点个赞~
注:本文中提供的代码均为完整代码,放入C++工程后可直接运行。

代码实现:

用C++类(class)实现,共包含三个文件:

  1. linklist.h 函数体声明
  2. linklist.cpp 函数实现
  3. main.cpp 测试代码

文件一 linklist.h

#ifndef LINKLIST_H
#define LINKLIST_H
#include<iostream>
using namespace std;

struct Node {
	char value;
	Node *next;
	Node() :next(NULL) {}; 				//创建结构体,并为next初始化
};

class LinkList {
public:
	Node* createAtBack(Node*,string);   //正序创建链表
	Node* createAtFront(Node*, string); //逆序创建链表
	void getLength(Node*);              //得到链表长度
	void getValue(Node*, int);			//找到在第i处的值
	void search(Node*, char);			//找到值value的位置
	Node* deleteByIndex(Node*,int); 	//删除指定位置的节点
	Node* deleteByValue(Node*, char);	//删除指点值的节点
	Node* reverse(Node*); 				//链表反转
	Node* insert(Node*, int, int); 		//链表插入
	void display(Node*); 				//输出链表
	bool isEqual(Node*, Node*);			//判断是否相等
};

#endif // !LINKLIST_H

文件二 linklist.cpp

#include<iostream>
#include"LinkList.h"
using namespace std;

Node* LinkList::createAtBack(Node *head,string a)
{
	Node *temp;
	Node *p;
	p = head;
	for (int i = 0; i < a.length(); i++)
	{
		temp = new Node;
		temp->value = a[i];
		p->next = temp;
		p = temp;
	}
	return head;
}

//基本不用
Node* LinkList::createAtFront(Node *head, string a)
{
	Node *temp;
	Node *p;
	p = head;
	for (int i = 0; i < a.length(); i++)
	{
		temp = new Node;
		temp->value = a[i];
		temp->next = p->next;
		p->next = temp;
	}
	return head;
}

void LinkList::display(Node *head)
{
	Node *temp;
	temp = head->next;
	while (temp!=NULL)
	{
		cout << temp->value << "";
		temp = temp->next;
	}
	cout << endl;
}

void LinkList::getLength(Node* head)
{
	Node* temp;
	temp = head;
	int j = 0;
	while(temp != NULL)
	{
		temp = temp->next;
		j++;
	}

	cout << "链表长度为" << j - 1 << endl;
}

void LinkList::getValue(Node* head, int i)
{
	Node *temp;
	temp = head;
	int j = 0;
	while (temp!=NULL)
	{
		if (j < i - 1)
		{
			temp = temp->next;
			j++;
		}
		else
		{
			cout << "在第" << i << "处的是" << temp->next->value;
			break;
		}
	}
	cout << endl;
}

void LinkList::search(Node*head, char value)
{
	Node *temp;
	temp = head->next;
	int j = 0;
	while (temp != NULL)
	{
		if (temp->value != value)
		{
			j++;
			temp = temp->next;
		}
		else
		{
			cout << value << "在第" << j + 1 << "个位置";
			break;
		}
	}
	if (temp == NULL)
	{
		cout << "找不到!";
	}
	cout << endl;
}

Node * LinkList::deleteByIndex(Node*head, int i)
{
	Node* temp;
	temp = head;
	int j = 0;
	while (temp!=NULL)
	{
		if (j < i - 1)
		{
			j++;
			temp = temp->next;
		}
		else
		{
			Node* s;
			s = new Node;
			s = temp->next;
			temp->next = s->next;
			delete s;
			break;//记得加break
		}
	}
	return head;
}

Node *LinkList::deleteByValue(Node*head, char value)
{
	Node* temp;
	temp = head;
	while (temp->next!=NULL)
	{
		if (temp->next->value!=value)
		{
			temp = temp->next;
		}
		else
		{
			Node *s;
			s = new Node;
			s = temp->next;
			temp->next = s->next;
			delete s;
			break;
		}
	}
	return head;
}

Node *LinkList::insert(Node* head, int i,int value)
{
	Node *temp;
	temp = head;
	int j = 0;
	while (temp!=NULL)
	{
		if (j < i - 1)
		{
			j++;
			temp = temp->next;
		}
		else
		{
			Node *s;
			s = new Node;
			s->value = value;
			s->next = temp->next;
			temp->next = s;
			break;
		}
	}
	return head;
	cout << endl;
}

Node* LinkList::reverse(Node* head)
{
	Node* p;
	Node* q;
	Node* t = NULL;
	p = head;
	if (p->next == NULL || p->next->next == NULL)
	{
		return head;
	}
	else
	{
		p = head->next;
		q = head->next->next;
		while (q!=NULL)
		{
			t = q->next;
			q->next = p;
			p = q;
			q = t;
		}

		head->next->next = NULL;
		head->next = p;
	}

	return head;
	cout << endl;
}

bool LinkList::isEqual(Node* head1, Node* head2)
{
	Node* temp1;
	Node* temp2;
	temp1 = head1->next;
	temp2 = head2->next;
	while (temp1 != NULL && temp2 != NULL)
	{
		if (temp1->next->value == temp2->next->value)
		{
			temp1 = temp1->next;
			temp2 = temp2->next;
		}
		else
		{
			return 0;
		}
	}
	if (temp == NULL && temp2 != NULL)
	{
		return 0;
	}
	if (temp != NULL && temp2 == NULL)
	{
		return 0;
	}
	return 1;
}

文件三 main.cpp


#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include"LinkList.h"
using namespace std;

int main()
{
	string a[3] = { "abc","xczx","ccc" };

	Node * head;
	vector<Node*>list;
	vector<string>word(a, a + 3);
	LinkList linkList;

	for (int i = 0; i < word.size(); i++)
	{
		head = new Node;
		list.push_back(linkList.createAtBack(head,word[i]));
	}

	for (int i = 0; i < word.size(); i++)
	{
		linkList.display(list[i]);
	}
	cout << endl;

	for (int i = 0; i < word.size(); i++)
	{
		linkList.getLength(list[i]);
	}
	cout << endl;

	for (int i = 0; i < word.size(); i++)
	{
		linkList.getValue(list[i],1);
	}
	cout << endl;

	for (int i = 0; i < word.size(); i++)
	{
		linkList.search(list[i], 'a');
	}
	cout << endl;

	for (int i = 0; i < word.size(); i++)
	{
		linkList.deleteByIndex(list[i], 1);
	}
	for (int i = 0; i < word.size(); i++)
	{
		linkList.display(list[i]);
	}
	cout << endl;

	for (int i = 0; i < word.size(); i++)
	{
		linkList.deleteByValue(list[i], 'b');
	}
	for (int i = 0; i < word.size(); i++)
	{
		linkList.display(list[i]);
	}
	cout << endl;

	for (int i = 0; i < word.size(); i++)
	{
		linkList.insert(list[i], 1,'b');
	}
	for (int i = 0; i < word.size(); i++)
	{
		linkList.display(list[i]);
	}
	cout << endl;

	for (int i = 0; i < word.size(); i++)
	{
		linkList.reverse(list[i]);
	}
	for (int i = 0; i < word.size(); i++)
	{
		linkList.display(list[i]);
	}
	cout << endl;

	linkList.insert(list[0], 1, 'c');
	cout << linkList.isEqual(list[0], list[1]) << endl;
	cout << linkList.isEqual(list[0], list[2]) << endl;

	system("pause");
	return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值