用C++编写程序,高手来帮帮忙!!!!急急急!!!!

要求:单链表的建立,插入,删除,查找,排序。我对C++一窍不通,附带各处作用,老师会提问的……

// dataStruct.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<iostream>
using namespace std;
//***********************************************************************
//节点部分
class node
{
int data;
node* link;
public:
node():link(NULL){ }
node(int value):link(NULL),data(value){}
~node(){};
void setLink(node* xt);
node* GetLink();
int& getData();
//void printElm();
} ;
void node::setLink(node* xt)
{
link = xt;
}
node* node::GetLink()
{
return link;
}
int& node::getData()
{
return data;
}
//***********************************************************************
//链表部分
class linklist
{
private:
node* head;
node* tail;
public:
linklist();
~linklist();
bool AddTail(int value);
int getCount();
bool IsEmpty();
bool insertAt(int index,int value);
node* getHead();
node* getTail();
bool removeTail();
bool removeAt(int index);
void printList();
node* reverse();
linklist* link(linklist*);
void DelElem();
void sort();
bool build_looplink(int num);//为链表在num个节点处建环,让尾节点指向它
bool detect_looplink();
};
linklist::linklist()//构造函数
{
head = tail =new node;//头结点和尾结点都指向一个空结点
tail->setLink(NULL);
}
linklist::~linklist()//析构函数
{
std::cout<<"call the destructor"<<std::endl;
}
bool linklist::AddTail(int value)//添加尾节点
{
node* n = new node(value);
tail->setLink(n);
tail = tail->GetLink();
tail->setLink(NULL);
if(tail!=NULL)//检测尾指针是否为空
return true;
else
return false;
}
//插入在位置index插入值为value的节点
bool linklist::insertAt(int index,int value)
{
if(index>this->getCount()||index<0)
{
std::cout<<"Wrong position!"<<std::endl;
return false;
}
node* x = new node(value);
node* q;//定义两个辅助指针来确定要插入的元素的位置
node* p;
p=head->GetLink();
q=head;
while(index)
{
--index;
q=q->GetLink();
p=p->GetLink();
}
if(p==NULL)//若插入的元素在表尾,则把x置为表尾
{
this->AddTail(value);
return true;
}
x->setLink(p);
q->setLink(x);
return true;

}
bool linklist::IsEmpty()
{
return head->GetLink()==NULL;
}
int linklist::getCount()
{
int count=0;
node *p = head->GetLink();
while(p!=NULL)
{
p=p->GetLink();
++count;
}
return count;

}
node* linklist::getHead()
{
return head;
}
node* linklist::getTail()
{
return tail;
}
bool linklist::removeAt(int index)
{
if(index>this->getCount()-1||index<0)
{
std::cout<<"Wrong position!"<<std::endl;
return false;
}
node* q;//定义两个辅助指针来确定要删除的元素的位置
node* p;
p=head->GetLink();
q=head;
index--;
while(index)
{
--index;
q=q->GetLink();
p=p->GetLink();
}
if(p==tail)//若删除的元素在表尾,则把q置为表尾
tail=q;
q->setLink(p->GetLink());
if(p==NULL)
return false;
else
return true;
free(p);
}
bool linklist::removeTail()
{
return true;
}
void linklist::printList()
{
node* p =head->GetLink();
while(p!=NULL)
{
std::cout<<p->getData()<<" ";
p=p->GetLink();
}
std::cout<<std::endl;
}
//两个链表连接
linklist* linklist::link(linklist* l)
{
if(l->IsEmpty())
return this;
node* y = l->getHead()->GetLink();
this->getTail()->setLink(y);
return this;
}
//删除链表中的重复元素
void linklist::DelElem()
{

}
//链表元素排序,利用冒泡法,大的数值逐步下沉,即如果前面大于后面,则两者交换
void linklist::sort()
{
node* first=this->getHead();
if(first->GetLink()->GetLink()!=NULL)//链表至少有两个元素才有必要排序
{
node* p=first->GetLink();
node* q=p->GetLink();
while(q!=NULL)
{
if(p->getData()>q->getData())//前者大于后者,则交换两个元素
{

}
}
}
}
node* linklist::reverse()
{
if(this->getHead()==NULL||this->getHead()->GetLink()==NULL)
{
return this->getHead();
}
node* cur =this->getHead();
node* pre =NULL;
node* temp;
while(cur->GetLink())
{
temp =pre;
pre=cur;
cur=cur->GetLink();
pre->setLink(temp);
}
cur->setLink(pre);
return cur;
}
bool linklist::build_looplink(int num)
{
node *cur =this->getHead()->GetLink();
int i=0;
if(num<0||cur==NULL)
{
cout<<"链表为空"<<endl;
return false;
}
for(int i=1;i<num;i++)
{
if(cur==NULL)
{
cout<<"链表error"<<endl;
return false;
}
cur=cur->GetLink();
}
this->getTail()->setLink(cur);
return true;
}
bool linklist::detect_looplink()
{
node* quick_node=this->getHead()->GetLink();
node* slow_node=this->getHead();
if(this->getHead()==NULL||this->getHead()->GetLink()==NULL)
{
cout<<"链表为空"<<endl;
return false;

}
while(quick_node!=slow_node)
{
if(quick_node==NULL||slow_node==NULL)
return false;
quick_node = quick_node->GetLink()->GetLink();
slow_node = slow_node->GetLink();
}
if(quick_node!=NULL&&slow_node!=NULL)//非尾节点相遇
return true;
return false;
}
//***********************************************************************
//主函数部分
int main(int argc,char** agrv)
{
linklist* l =new linklist();
cout<<"链表开始元素个数为"<<l->getCount()<<endl;
l->AddTail(12);
l->AddTail(45);
l->AddTail(38);
l->AddTail(48);
l->AddTail(59);
l->removeAt(2);
l->insertAt(0,23);
cout<<"链表当前元素个数为"<<l->getCount()<<endl;
l->printList();
linklist* m =new linklist();
m->AddTail(78);
m->AddTail(21);
m->AddTail(25);
l->link(m);
cout<<"合并链表后链表元素个数为"<<l->getCount()<<endl;
l->printList();
/*
node* x=l->reverse();
while(x->GetLink()!=NULL)
{
x=x->GetLink();
cout<<x->getData()<<" ";
}
*/
cout<<l->getCount()<<endl;
cout<<l->build_looplink(2)<<endl;
cout<<l->detect_looplink()<<endl;
delete l;
return 0;
}
刚写的程序,c-free调试通过
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-06-14
动态创建链表
Book* CreateHead()
{
Book *head,*p1,*p2;//定义三个指向Book的类,返回值给head
p1=new Book;
head=p1;
p2=p1;//将三个结点一起在椎中创建
cout<<"请输入图书编号,以0结束"<<endl;
cin>>p1->num;
if (p1->num!=0)
{
cout<<"请输入图书价格"<<endl;
cin>>p1->price;
}
else
{
delete p1;p2=NULL;return head;
}
while(p1->num!=0)
{
p2=p1;//这步很重要,意思为将P2设为当前结点,然后用p1继续创建,用培p2->next指向p1
p1=new Book;
cout<<"请输入图书编号,以0结束"<<endl;
cin>>p1->num;
if (p1->num!=0)
{
cout<<"请输入图书价格"<<endl;
cin>>p1->price;
}
p2->next=p1;
}
delete p1;
p2->next=NULL;
return head;
}
//删除链表某个结点
void Delete(Book *p,int num)
{
Book *temp;
if (p->num==num)
{
temp=p;
p=p->next;
::p=p;
delete temp;
return;
}
while(p)
{
if(p->next==NULL)
{
cout<<"null"<<endl;
return;
}
if(p->next->num==num)
{
temp=p->next;
p->next=temp->next;
delete temp;
cout<<"ok"<<endl;
return;
}
p=p->next;
}
cout<<"null"<<endl;
}
//插入链表
#include "stdafx.h"
#include <iostream>
using namespace std;
//C++动态链表的建立
class Book
{
public:
int num;
int price;
Book *next;
};
Book *p;
//创建头结点返回头结点地址给程序调用
Book* CreateHead()
{
Book *head,*p1,*p2;//定义三个指向Book的类,返回值给head
p1=new Book;
head=p1;
p2=p1;//将三个结点一起在椎中创建
cout<<"请输入图书编号,以0结束"<<endl;
cin>>p1->num;
if (p1->num!=0)
{
cout<<"请输入图书价格"<<endl;
cin>>p1->price;
}
else
{
delete p1;p2=NULL;return head;
}
while(p1->num!=0)
{
p2=p1;//这步很重要,意思为将P2设为当前结点,然后用p1继续创建,用培p2->next指向p1
p1=new Book;
cout<<"请输入图书编号,以0结束"<<endl;
cin>>p1->num;
if (p1->num!=0)
{
cout<<"请输入图书价格"<<endl;
cin>>p1->price;
}
p2->next=p1;
}
delete p1;
p2->next=NULL;
return head;
}
void Show(Book *head)
{
while(head!=NULL)
{
cout<<"图书编号为:"<<head->num<<",价格为:"<<head->price<<endl;
head=head->next;
}
}

//删除链表某个结点
void Delete(Book *p,int num)
{
Book *temp;
if (p->num==num)
{
temp=p;
p=p->next;
::p=p;
delete temp;
return;
}
while(p)
{
if(p->next==NULL)
{
cout<<"null"<<endl;
return;
}
if(p->next->num==num)
{
temp=p->next;
p->next=temp->next;
delete temp;
cout<<"ok"<<endl;
return;
}
p=p->next;
}
cout<<"null"<<endl;
}

//链表的添加(这里假设直接添加到最尾段)
void Insert(Book *p,int num,int price)
{
Book *temp=new Book;//这个结点用于添加编号和价格
Book *tem=new Book;//这个结点用于存放尾结点地址
while(p)
{
tem=p;
p=p->next;
}
temp->num=num;
temp->price=price;
tem->next=temp;
temp->next=NULL;

}
int _tmain(int argc, _TCHAR* argv[])
{
p=CreateHead();
Show(p);
cout<<endl;
cout<<"请输入要删除的编号"<<endl;
int num;
cin>>num;
Delete(p,num);
Show(p);
cout<<"请输入编号"<<endl;
cin>>num;
int price;
cout<<"请输入价格"<<endl;
cin>>price;
Insert(p,num,price);
Show(p);
system("pause");
return 0;
}追问

好多错误啊,这是单链表的创建,插入,删除,查找,排序吗?

第2个回答  2012-06-14
给我邮箱我发一个双向的给你
相似回答