6.3w+
社区成员
#include<iostream.h>
#include<string.h>
struct list
{
int number;
list *Next;
};
list *head;
list *LCreat();//创建
void LInsert();//插入
void LDelete();//删除
void LCompoistor();//从小到大排序
char LInput();//输入
void LOutput();//输出
void LSelect();//操作选择
void main()
{
LSelect();
}
char LInput()
{
char ch;
cout<<"输入:";
cin>>ch;
return ch;
}
void LSelect(void)
{
char select;
cout<<"请选择链表操作功能:"<<endl;
cout<<"*. 创建链表-----C"<<endl;
cout<<"*. 显示链表-----S"<<endl;
cout<<"*. 删除结点-----D"<<endl;
cout<<"*. 插入结点-----I"<<endl;
cout<<"*. 合并链表-----U"<<endl;
cout<<"*. 排序链表-----P"<<endl;
cout<<"*. 退出程序-----Q"<<endl;
switch(LInput())
{
case 'c'|'C':
LCreat();
break;
case 'i'|'I':
LInsert();
break;
case 'd'|'D':
LDelete();
break;
case 'p'|'P':
LCompoistor();
break;
case 's'|'S':
LOutput();
break;
case 'q'|'Q':
cout<<endl<<"按任意键退出!"<<endl;
return ;
break;
default:
cin.get();
}
cout<<endl;
LSelect();
}
list *LCreat()
{
char ListName[80];
list *ls,*le;
//cout<<"请输入创建链表名称:";
//cin>>ListName;
head=NULL;
ls=new list;
cin>>ls->number;
while(ls->number)
{
if(head==NULL)
{
head=ls;
}
else
{
le->Next=ls;
}
le=ls;
ls=new list;
cin>>ls->number;
}
le->Next=NULL;
delete []ls;
return head;
}
void LDelete()
{
int number;
list *dl;
list *tempHead;
list *point;
tempHead=head;
dl=head;
cout<<"删除结点:";
cin>>number;
if(head==NULL) //空表不能删除
{
cout<<"空表"<<endl;
return ;
}
if(dl->number==number) //删除的是第一个结点
{
point=head;
head=head->Next;
delete []point;
return ;
}
while(dl->Next) //不是第一个结点 从第二结点查找
{
if(dl->Next->number==number)
{
point=dl->Next;
dl->Next=point->Next;
delete point;
return ;
}
dl=dl->Next ;
}
head = tempHead;
}
void LInsert()
{
list *il;
list *sl;
list *point;
sl=head;
il=new list;
cout<<"插入结点:";
cin>>il->number;
if(head==NULL)
{
head=il;
il->Next=NULL;
}
while((il->number>sl->number)&&sl!=NULL) //查找插入点
{
point=sl;
sl=sl->Next;
}
if(head->number==sl->number)
{
il->Next=head;
head=il;
}
else
{
point->Next=il;
il->Next=sl;
}
}
void LCompoistor()
{
list *point,*pe,*ps;
list *sl;
sl=head;
pe=head;
if((head==NULL)||(ps=NULL))
return ;
while(sl->Next->number<)
{
point=sl;
sl=sl->Next;
}
point=head;
if(point->number==head->number)
{
ps->Next=head;
head=ps;
//sl=sl->Next;sl=sl->Next;
//pe->Next=sl;
sl=sl->Next;
sl->Next=NULL;
// cout<<ps->number;
}
}
void LOutput()
{
list *tempHead;
tempHead=head;
while(head)
{
cout<<head->number<<endl;
head=head->Next;
}
head=tempHead;
}
#include<iostream>
using namespace std;
//定义结点类型
template <class T>
struct node
{
T data;
node<T> *next;
};
//定义单链表类
template <class T>
class List
{
public:
List();
~List();
void append(const T& item);//向表尾添加新元素
void remove();//删除
void output() const;//打印显示
private:
node<T> *head;//链表头指针
};
template<class T>
List<T>::List()
{
head = NULL;
}
template<class T>
List<T>::~List()
{
node<T> *p;
while(head != NULL)
{
p = head;
head = p->next;
delete p;
}
}
template<class T>
void List<T>::append(const T& item)
{
node<T> *p = new node<T>;
p->data = item;
p->next = NULL;
if(head == NULL)
{
head = p;
return;
}
node<T> *s = head;
while(s->next != NULL)
{
s = s->next;
}
p->next = s->next;
s->next = p;
}
template<class T>
void List<T>::remove()
{
node<T> *p;
while(head != NULL)
{
p = head;
head = p->next;
delete p;
}
}
template<class T>
void List<T>:: output() const
{
node<T> *p = head;
while(p != NULL)
{
cout<<p->data<<endl;
p = p->next;
}
}
int main()
{
List<int> student;//定义单链表
student.append(1);//添加
student.append(2);
student.output();//打印
student.remove();//删除
return 0;
}
//表头插入结点
void InsertFront ( const T & item ){
//如果链表为空
if( IsEmpty() )
GreatFront( item );
else
{
head = GetListNode( item , head );
size++;
}
}
//表尾插入结点
void InsertRear ( const T & item ){
//如果链表为空
if( IsEmpty() )
GreatFront( item );
else
{
ListNode * p = GetListNode( item );
rear->next = p;
//修改尾指针
rear = p;
size++;
}
}
//在当前结点前插入结点
void InsertBefore( ListNode * currptr , const T & item ){
ListNode * temp = GetListNode ( item );
ListNode * p = head;
if( head == currptr )
InsertFront( item );
else
{
while( p != NULL && p->next != currptr )
p = p->next;
if( p == NULL )
throw invalid_argument ("invalid position");
temp->next = currptr;
p->next = temp;
size++;
}
}
//在当前结点后插入结点
void InsertAfter ( ListNode * currptr , const T & item ){
if( currptr == NULL )
throw ("invalid position");
if( currptr == rear )
InsertRear(item);
else{
ListNode * p = GetListNode ( item );
p->next = currptr->next;
currptr->next = p;
size++;
}
}
//将链表反向
void revease(){
Node * pE = head;
Node * pH = pE->next;
Node * temp = pH->next;
pE->next = 0;
while( pH != 0 )
{
pH->next = pE;
pE = pH;
pH = temp;
if( temp != 0 )
temp = temp->next;
}
head = pE;
}
//清空整个链表
void Clear() {
ListNode * p = head ;
ListNode * temp = p ;
while( p != NULL )
{
p = p->next;
FreeListNode(temp);
temp = p;
}
head = rear = NULL ;
size = 0;
}
//顺序打印整个链表
void Print() const {
ListNode * currptr = head;
while( currptr != NULL )
{
std::cout<data<<' ';
currptr = currptr->next;
}
std::cout< }
//对链表排序
void Sort(){
ListNode * p = head;
size_t n = Size();
for ( int j = 1 ; j < n ; ++j )
{
p = head ;
for( int i = 0 ; i < n - j ; ++i )
{
if( p->data > p->next->data )
{
T temp = p->data;
p->data = p->next->data;
p->next->data = temp;
}
p = p->next;
}
}
}
//删除当前结点
void Delete( ListNode * currptr ){
if( currptr != NULL ) {
ListNode * temp = head;
if( head == currptr )
head = head->next;
else{
ListNode * p = head;
while( p->next != NULL && p->next != currptr )
p = p->next;
if( p->next == NULL )
throw ("invalid position");
ListNode * temp = p->next;
p = temp->next;
}
FreeListNode(temp);
}else
throw ("invalid position");
}
//查看当前结点
const T & Peek( const ListNode * currptr ) const {
return currptr->Peek();
}
T & Peek( ListNode * currptr ) {
return currptr->Peek();
}
//修改当前结点
void SetData( const T & item , ListNode * currptr ) {
currptr->SetData(item);
}
protected:
//表头指针和表尾指针
ListNode * head, * rear;
//链表中结点的个数
size_t size;
//生成新结点
ListNode * GetListNode ( const T & item , ListNode * PtrNext = NULL ){
ListNode * p = new ListNode ( item , PtrNext );
return p;
}
//释放ListNode(p)所占的内存空间
void FreeListNode ( ListNode * p ){
delete p;
}
//创建头结点
void GreatFront ( const T & item )
{
head = GetListNode( item );
rear = head;
size++;
}
};
#endif
#ifndef linkedlist_h
#define linkedlist_h
#include
#include
#include "listnode.h"
template < class T >
class LinkedList
{
public:
//构造函数
LinkedList (): head ( NULL ), rear ( NULL ), size ( 0 ) {}
//拷贝构造函数
LinkedList ( const LinkedList & list )
: head ( NULL ) , rear ( NULL ) , size ( 0 ) {
ListNode * p = list.head;
while( p != NULL ) {
InsertRear(p->data);
p = p->next;
}
}
LinkedList & operator = ( const LinkedList & list ) {
if( &list != this ) {
Clear();
const ListNode * p = list.Head();
while( p != NULL ) {
InsertRear(p->data);
p = p->next;
}
}
return *this;
}
//析构函数
virtual ~LinkedList () {
Clear();
}
const ListNode * Head() const {
return head;
}
ListNode * Head() {
return head;
}
const ListNode * Rear() const {
return rear;
}
ListNode * Rear() {
return rear;
}
//返回链表的个数
size_t Size () const {
return size;
}
//判断链表是否为空
bool IsEmpty () const {
return ( head == NULL ) ? true : false ;
}
/* 插入一个data域值为item的结点 */
//顺序插入结点
void Insert ( const T & item ){
//如果链表为空
if( IsEmpty() ) {
head = GetListNode( item );
rear = head;
size++;
return ;
}
if( item < head->data )
InsertFront(item);
else {
ListNode * temp = GetListNode( item );
ListNode * p = head;
while( ( p->next != NULL ) && ( item > p->next->data ) )
p = p->next;
temp->next = p->next;
//如果到链尾,修改rear
if( p->next == 0 )
rear = temp;
p->next = temp;
size++;
}
}
#ifndef listnode_h
#define listnode_h
#include
template < class T >
class LinkedList;
template < class T >
class ListNode
{
friend class LinkedList;
public:
//构造函数
ListNode ( const T & item = T(), ListNode * ptrnext = NULL )
:data ( item ) , next ( ptrnext ){}
//查看结点的data值
const T & Peek() const {
return data;
}
T & Peek() {
return data;
}
//修改data值
void SetData(const T & item ) {
data = item ;
}
//返回next指针
const ListNode * Next() const {
return next;
}
ListNode * Next() {
return next;
}
//修改next值
void SetNext(ListNode * p) {
next = p;
}
protected:
T data;
ListNode * next;
};
#endif