请C++高手帮帮忙,拜托了

用头插法建立带头结点的的单链表,并进行插入、删除操作,输出每次操作结果
用尾插法建立两个单链表,并设计算法将两个链表合并(data,整型)
要完整的程序,拜托了

我们也在写这东西,不过要MFC的,这个黑框的倒是可以用,你自己改造下主函数把吧。
#include <iostream.h>
#include <stdlib.h>
typedef int DataType;
class List; //前视定义,否则友元无法定义
class LinkNode{ //链表结点类的定义
friend class List;
private:
LinkNode *link;
int data;
public:
LinkNode (LinkNode *ptr = NULL) {link=ptr;}
LinkNode(const int & item, LinkNode *ptr = NULL)
{ data=item;link=ptr;}
~LinkNode(){};
};
class List {
private:
LinkNode *first; //指向头结点的头指针
public:
List () { first = new LinkNode ();}
//带头结点构造函数
List ( const int &x ) {
//不带头结点构造函数
first = new LinkNode ( x ); }
~List (){MakeEmpty(); delete first;} //析构函数
void MakeEmpty ( ); //链表置空
int Length ( ) const; //求链表长度
LinkNode * getHead() const {return first;}
LinkNode *Find ( int x );
LinkNode *Locate ( int i );
DataType GetData ( int i );
void SetData (DataType x,int i );
void Insert (DataType x , int i);
void Remove (DataType &x, int i );
int IsEmpty()const{
return(first->link==NULL? 1:0);}
void input(DataType endTag);
void output();
};

void List :: MakeEmpty ( )
{
//删去链表中除表头结点外的所有其它结点
LinkNode *q;
while ( first->link != NULL ) {
q = first->link;
first->link =q ->link;
//将表头结点后第一个结点从链中摘下
delete q; //释放它
}
};

int List::Length ( ) const
{
LinkNode *p = first->link;
//检测指针p指示第一个结点
int count = 0;
while ( p != NULL ) { //逐个结点检测
count++;
p = p->link;
}
return count;
}

LinkNode * List::Find ( int x )
{
LinkNode *p = first->link; //指针 p 指示第一个结点
while ( p != NULL && p->data != x )
p = p->link;
return p; // p 在搜索成功时返回找到的结点地址
// p 在搜索不成功时返回空值
}

LinkNode * List::Locate ( int i ){
if ( i < 0 ) return NULL;
LinkNode *p = first; int j = 0;
while ( p != NULL && j < i ) // j = i 停
{ p = p->link; j++; }
return p;
}

DataType List::GetData( int i ) {//提取第 i 个结点的值
LinkNode *p = Locate( i ); // p 指向链表第 i 个结点
return p->data;
}

void List::SetData(DataType x,int i ) {//给第 i 个结点赋值
if ( i <= 0 ) return;
LinkNode *p = Locate ( i ); // p 指向链表第 i 个结点
if (p!=NULL) p->data=x;
}

void List::Insert (DataType x , int i)
{//在第i个结点处插入一个data域值为x的新结点
LinkNode *p = Locate ( i-1);
LinkNode * newNode = new LinkNode (x) ;
//构造新结点newNode
newNode->link=p->link;
p->link=newNode; //新结点插入第i个结点前

}

void List::Remove(DataType &x, int i )
{
LinkNode *p = Locate (i-1), *q;
q = p->link;
p->link = q->link; //重新链接
x = q->data;
delete q;
}

void List::input (DataType endTag)
{
LinkNode *newnode; DataType val;
first=new LinkNode ();
if (first==NULL) {cerr<<"存储分配错误"<<endl;exit(1);}
cin>>val;
while(val!=endTag) {
newnode=new LinkNode (val);
if (newnode==NULL)
{cerr<<"存储分配错误"<<endl;exit(1);}
newnode->link=first->link;
first->link=newnode; cin>>val; }
}

void List ::output ( )
{//依次输出各结点的值
LinkNode *p=first->link;
while(p!=NULL) {
cout<<p->data<<endl;
p=p->link;
}
}

void Union ( List &LA, List &LB ) {
int n = LA.Length ( );
int m = LB.Length ( );
for ( int i = 1; i <= m; i++ ) {
DataType x = LB.GetData(i);
//在B中取一元素
LinkNode *k = LA.Find (x); //在A中搜索它
if ( !k ) //若未找到插入它
{ LA.Insert (x,n++); }
}
}
void Intersection(List &LA, List &LB ) {
int n = LA.Length ( );
int m = LB.Length ( );
int i = 1;
while ( i <= n ) {
DataType x = LA.GetData (i);
//在LA中取一元素
LinkNode *k = LB.Find (x); //在LB中搜索它
if ( !k ) { LA.Remove (x,i); n--; }
else i++; //未找到在LA中删除它
}
}

int main()
{
int inputdata=0;
List l1,l2;
cout<<"请输入集合A的元素:(以-1结尾)"<<endl;
l1.input(-1);
cout<<"集合A的元素为:"<<endl;
l1.output();
cout<<"请输入集合B的元素:(以-1结尾)"<<endl;
l2.input(-1);
cout<<"集合B的元素为:"<<endl;
l2.output();
//集合的并、交运算
Union(l1,l2);
cout<<"集合并为:"<<endl;
l1.output();
cout<<"集合A的元素为:"<<endl;
l1.output();
cout<<"集合B的元素为:"<<endl;
l2.output();
cout<<"集合交为:"<<endl;
Intersection(l1,l2);
l1.output();
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-11
这是作业不是问题,要是你不会哪问问还差不多
相似回答