您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】·【带头结点的单链表】

2014-01-25 16:58 381 查看
比较坑爹的基础啊,大把时间浪费在构造函数上,构造函数(出生决定命运!)。

自己解决的bug,感觉还不错。其实程序的核心是算法,算法建立在数据结构的基础之上。

大部分的程序员现在学的基本都是规则,而不是创造。

但掌握了规则,也能创造很多财富。

重新巩固我弱爆了的数据结构,没敲完数据结构的程序员不是好领导。

注释就不写了,可以提问,或者建议。

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

class Student{
public:
	int id;
	string name;
	int score;
	Student(){}
	Student(int _id,string _name,int _score){
		id=_id;
		name=_name;
		score=_score;
	}
	friend ostream & operator<<(ostream & os,Student& temp){
		os<<"ID:"<<temp.id<<"\tName:"<<temp.name<<"\tScore:"<<temp.score<<endl;
		return os;
	}
};

template<class T>
struct LinkNode{
	T data;
	LinkNode<T> * link;
	LinkNode(T& item){
		data=item;
		link=NULL;
	}
	LinkNode<T>(){}
};

template<class T>
class List{
public:
	LinkNode<T> * first;
	List(){
		first=new LinkNode<T>;
		first->link=NULL;
	}
	~List(){
		makeEmpty();
	}
	void makeEmpty();
	int Length();
	LinkNode<T> *getHead(){
		return first;
	}
	LinkNode<T> *Search(T x);
	LinkNode<T> *Locate(int i);
	bool getData(int i,T& x);
	void setData(int i,T& x);
	bool Insert(int i,T& x);
	bool Remove(int i,T& x);
	bool IsEmpty(){
		return first->link==NULL?true:false;
	}
	void output();

};

template<class T>
void List<T>::makeEmpty(){
	LinkNode<T> *q;
	while(first->link!=NULL){
		q=first->link;
		first->link=q->link;
		delete q;
	}
}

template<class T>
int List<T>::Length(){
	LinkNode<T> * p=first->link;
	int count=0;
	while(p!=NULL){
		p=p->link;
		count++;
	}
	return count;
}

template<class T>
LinkNode<T> *List<T>::Search(T x){
	LinkNode<T> * current=first->link;
	while(current!=NULL){
		if(current->data==x)
			break;
		else
			current=current->link;
	}
}

template<class T>
LinkNode<T> * List<T>::Locate(int i){
	if(i<0)
		return NULL;
	LinkNode<T> * current =first;
	int k=0;
	while(current->link!=NULL&&k<i){
		current=current->link;
		k++;
	}
	return current;
}

template<class T>
bool List<T>::getData(int i,T& x){
	if(i<0)
		return NULL;
	LinkNode<T> * current=Locate(i);
	if(current==NULL)
		return false;
	else{
		x=current->data;
		return true;
	}
}

template<class T>
void List<T>::setData(int i,T& x){
	if(i<0)
		return;
	LinkNode<T> *current=Locate(i);
	if(current==NULL)
		return;
	else
		current->data=x;
}

template<class T>
bool List<T>::Insert(int i,T& x){
	LinkNode<T> * current=Locate(i);
	if(current==NULL)
		return false;
	LinkNode<T> *newNode=new LinkNode<T>(x);
	if(newNode==NULL){
		cerr<<"存储分配错误!"<<endl;
		exit(1);
	}
	newNode->link=current->link;
	current->link=newNode;
	return true;
}

template<class T>
bool List<T>::Remove(int i,T& x){
	LinkNode<T> * current=Locate(i-1);
	if(current==NULL||current->link==NULL)
		return false;
	LinkNode<T> *del=current->link;
	current->link=del->link;
	x=del->data;
	delete del;
	return true;
}

template<class T>
void List<T>::output(){
	LinkNode<T> *current=first->link;
	while(current!=NULL){
		cout<<current->data<<endl;
		current=current->link;
	}
}

void main(){
	List<Student> stu;	
	if(stu.IsEmpty()){
		cout<<"单链表为空!"<<endl;
	}
	int id;
	string name;
	int score;
	int num;
	cout<<"输入数据个数:";
	cin>>num;
	for(int i=0;i<num;i++){
		cout<<"输入学号:";
		cin>>id;
		cout<<"输入姓名:";
		cin>>name;
		cout<<"输入成绩:";
		cin>>score;
		Student student(id,name,score);
		stu.Insert(i+1,student);
	}
	stu.output();
	Student student;//用于删除
	stu.Remove(2,student);
	stu.output();
	Student s1(123,"biubiu",12);
	stu.Insert(2,s1);
	stu.output();
}
运行截图:




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: