关闭

删除线性表指定位置的元素(单链表实现)

标签: C++数据结构
1227人阅读 评论(0) 收藏 举报
分类:

刚开始接触C++和数据结构,写的第一个C++作业题,程序短小却调了快两天。万事开头难啊,纪录一下下。

课本是《数据与算法分析》(C++版)(第三版)Clifford A. Shaffer


4.1假设一个线性表包含下列元素:<|2,23,15,5,9>,使用图4.1的List ADT编写一些C++语句,删除值为15的元素。

#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>
using namespace std;

template <typename E> 
class List{
private:
	void operator =(const List&) {}
	List(const List&) {}
public:
	List() {}
	virtual ~List() {}
	virtual void clear() = 0;
	virtual void insert(const E& item) = 0;
	virtual void append(const E& item) = 0;
	virtual E remove() = 0;
	virtual void moveToStart() = 0;
	virtual void moveToEnd() = 0;
	virtual void prev() = 0;
	virtual void next() = 0;
	virtual int length() const  = 0;
	virtual int currPos() = 0;
	virtual void moveToPos(int pos) = 0;
	virtual const E& getValue() const = 0;
};

template <typename E>
class Link{
public:
	E element;
	Link *next;
	Link(const E& elemval, Link* nextval = NULL) {
		element = elemval;
		next = nextval;
	}
	Link(Link* nextval = NULL){
		next = nextval;
	}
};

template<typename E> 
class LList : public List<E>{
private:
	Link<E>* head;
	Link<E>* tail;
	Link<E>* curr;
	int cnt;

	void init(){
		curr = tail = head = new Link<E>;
		cnt = 0;
	}
	void removeall(){
		while (head != NULL){
			curr = head;
			head = head->next;
			delete curr;
		}
	}
public:
	LList(int size = defaultSize){init();}
	~LList() { removeall(); }
	void print(){
		int cnt2;
		cnt2 = cnt;
		curr = head->next;
		while (cnt2) {
			cout << curr->element<<" ";
			curr = curr->next;
			cnt2--;
		}
	}
	void clear() {
		removeall();
		init();
	}
	void insert(const E& it){
		curr->next = new Link<E>(it, curr->next);
			if (tail == curr)
				tail = curr->next;
		cnt++;
	}
	void append(const E& it) {
		tail = tail->next = new Link<E>(it,NULL);
		cnt++;
	}
	E remove() {
		assert(curr->next!=NULL, "No element");
		E it = curr->next->element;
		Link<E>* ltemp = curr->next;
		curr->next = curr->next->next;
		delete ltemp;
		cnt--;
		return it;
	}
	void moveToStart() { curr = head; }
	void moveToEnd() { curr = tail; }
	void prev() {						//find curr before
		if (curr == head) return;
		Link<E>* temp = head;
		while (temp != curr)
			temp = temp->next;
		curr = temp;
	}
	
	void next() {
		if(curr->next!=tail)
		curr = curr->next;
	}

	int length() const{
		return cnt;
	}

	int currPos(){
		Link<E>* temp = head;
		int i;
		for (i = 0; curr != temp; i++)
		temp = temp->next;
		return i;
	}		
	void moveToPos(int pos) {
		assert((pos>=0) && (pos <= cnt), "Position out of range");
		curr = head;
		for (int i = 0; i< pos; i++)
			curr = curr->next;
	}

	const E& getValue() const {
		assert(curr->next != NULL, "No Value");
			return curr->next->element;
	}
};

int main()
{
	int num;
	int i;
	LList<int>L1(100);
	L1.clear();
	cout << "请输入5个数:"<<endl;
	for (i = 0; i < 5; i++) {
		cin >> num;
		L1.append(num);	//在线性表的尾部插入节点
	}
	cout << "线性表包含下列元素:" << endl;
	L1.print();			//打印线性表的所有元素
	L1.moveToPos(2);	//将curr移动到要删除的元素前
	L1.remove();		//删除curr的后一个节点
	cout << endl<<"删除第三个元素后,线性表包含下列元素:" << endl;
	L1.print();	
	system("pause");
}


输入:2 23 15 5 9,运行结果如下图





1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

线性表的顺序存储结构及该结构的插入与删除

顺序存储定义线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。 顺序存储方式 线性表的顺序存储结构,就是在内存中找了块地儿,通过站位的形式,把一定内存空间给占了,...
  • J_1234567890
  • J_1234567890
  • 2016-05-06 10:52
  • 3485

数据结构Java实现 --单向链表的插入和删除

文本主要内容: 链表结构单链表代码实现单链表的效率分析 一、链表结构: (物理存储结构上不连续,逻辑上连续;大小不固定)            概念:   链式存储结构是基于指针实现的。我们把...
  • mlljava1111
  • mlljava1111
  • 2015-10-08 22:23
  • 4906

C/C++学习(六)线性表的插入、删除和查找

查找 查找线性表是最基本的操作之一,比如根据序号查找元素的值,或者根据值查找该值是否在线性表中,如果在,那么序号是几等等。   插入 如果插入的位置不合理,那么就抛出异常。如果线性表长度大...
  • qq_15145665
  • qq_15145665
  • 2015-12-14 21:17
  • 1535

线性表---单链表(创建、找中间节点、删除头元素)

#include #include using namespace std;typedef struct node { int num; struct node *next; }Nod...
  • will130
  • will130
  • 2015-10-17 20:50
  • 385

已知线性表中元素以值递增有序排列,并以单链表作为存储结构,设计一个算法,删除表中值相同的多余元素

已知线性表中元素以值递增有序排列,并以单链表作为存储结构 设计一个算法,删除表中值相同的多余元素 使得操作后表中所用元素值均不同,同时释放被删除的结点空间
  • cckevincyh
  • cckevincyh
  • 2015-05-15 22:08
  • 6557

线性表,单链表,栈 java实现

  • 2017-12-09 19:40
  • 13KB
  • 下载

线性表的单链表实现

  • 2008-05-20 20:47
  • 4KB
  • 下载

数据结构实战--线性表的单链表实现

  • 2015-03-26 00:05
  • 2KB
  • 下载

C++ 数据结构中单链表实现线性表

  • 2011-06-01 15:13
  • 10KB
  • 下载

单链表的基本操作(尾插,尾删,头插,头删,查找,指定位置插入、删除,指定元素删除、全部删除等)

单链表的基本操作(尾插,尾删,头插,头删,查找,指定位置插入、删除,指定元素删除、全部删除等)
  • ZWE7616175
  • ZWE7616175
  • 2017-08-01 13:53
  • 246
    个人资料
    • 访问:15065次
    • 积分:308
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:2篇
    • 译文:0篇
    • 评论:12条
    关于我
    文章分类
    最新评论