前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++练手】C++实现单链表

【C++练手】C++实现单链表

作者头像
程序员互动联盟
发布2018-03-16 14:57:51
1.2K0
发布2018-03-16 14:57:51
举报

前几天找实习的时候,一个面试官给我留了一个题,做一个链表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++实现链表的功能,基本上就是用来练手用,在C++的模版里面已经有很多实现了,作为练手的小练习还是挺有意思的。勤快的小伙伴可以对着代码调试起来,加强自己基本功的练习。

修改自:http://blog.csdn.net/kevin_zhai/article/details/50494020

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档