第十周第八章

  • 实验作业

1.调试分析课本每一个例题,有可能的话更改成2-3个方法的新程序;

插入结点到链表中

student *insert(student *head,student *stud)
{
	student *p0,*p1,

		8p2;
	p1=head;
	p0=stud;
	if(head==NULL)
	{
		head=po;
		po->next=NULL;
	}
	else
		while((p0->num>p1->num)&&(pi->next!=NULL))
		{
			p2=p1;
			p1=p1->next;
		}
		if(p0->num<=p1->num)
		{
			if(head==p1)
				head=p0;
			else
				p2->next=p0;
			p0->next=p1;
		}
		else
		{
			p1->next=p0;
			p0->next=NULL;
		}
		n++;

		return head;
}


2.编程实现课本每一个编程习题。

#include<iostream>
using namespace std;

struct student
{
	int num;
	char name[20];
	float class1;
	float class2;
	float class3;
}stu1;

int main()
{
	cout<<"输入学号,姓名,英语成绩,数学成绩,语文成绩"<<endl;
	cin>>stu1.num>>stu1.name>>stu1.class1>>stu1.class2>>stu1.class3;
	cout<<stu1.num<<stu1.name<<stu1.class1<<stu1.class2<<stu1.class3<<endl;

	return 0;
}


3. 建立一个链表,每一个学号包括学号、姓名、性别、成绩,输入一个成绩,如果在链表中节点成绩等入输入的成绩,则将其删除。


#include<iostream>
using namespace std;

struct student    //***********
{
	int num;   //***********
	char name[20];   //***********
	char sex;   //***********
	float score;   //***********
	student *next;   
};

int n=0;
student *creat()//***********新建链表
{
	student *head,*p1,*p2;
	head=NULL;
	p1=new(student);
	p2=p1;
	cout<<"请输入学生的学号、姓名、性别(m/w)、成绩,当学号为0时,停止输入:"<<endl;   //***********
	cin>>p1->num>>p1->name>>p1->sex>>p1->score;   //***********
	while(p1->num!=0)
	{
		n++;
		if(n==1)
			head=p1;
		else
		{
			p2->next=p1;
			p2=p1;
		}
		p1=new(student);
		cin>>p1->num>>p1->name>>p1->sex>>p1->score;   //***********
	}
	delete p1;
	p2->next=NULL;

	return head;

}

void print(student *head)   //***********输出链表
{
	student *p;
	p=head;
	if(p==NULL)return;
	do
	{
		cout<<p->num<<"    "<<p->name<<"    "<<p->sex<<"    "<<p->score<<endl;   //***********
		p=p->next;
	}while(p!=NULL);
}


student *del(student *head,int score)   //***********删除链表    score可改
{
	student *p1,*p2;
	if(head==NULL)
	{
		cout<<"list null"<<endl;
		return head;
	}
	p1=head;
	while(score!=p1->score&&p1->next!=NULL)   //***********    score可改

	{
		p2=p1;
		p1=p1->next;
	}
	if(score==p1->score)   //***********    score可改
	{
		if(p1==head)
			head=p1->next;
		else
			p2->next=p1->next;
		cout<<"delete:"<<score<<endl;   //***********    score可改
		n--;
	}
	else
		cout<<score<<"not been found!"<<endl;   //***********    score可改

		return head;
}
	
int main()
{
	student *head=creat();
	cout<<"新建的链表为:"<<endl
		<<"学号\t姓名\t性别\t成绩"<<endl;
	print(head);

	int score;    //*******************
	cout<<"请输入你要删除的成绩:";
	cin>>score;
	head=del(head,score);
	cout<<"目前的链表为:"<<endl;
		print(head);

	return 0;
}


4.有两个链表,结点数据信息相同。将其合并成一个链表,节点数据不能重复。


#include<iostream>  
using namespace std;  
  
struct link  
{  
	int num;
	link *next;
};

void change(link *head1,link *head2);
link *creat1();  
link *creat2();
void print(link *h);
link *del(link *head2,int num);
link *merger(link *head1,link *head2);

int main()  
{  
	int m1=0,m2=0;
    link *head1=creat1();  
	link *head2=creat2();
    cout<<"Á´±í1Ϊ£º"<<endl;  
    print(head1);      
    cout<<"Á´±í2Ϊ£º"<<endl;  
    print(head2);
	change(head1,head2);
	cout<<"ɾ³ýºóÁ´±í2Ϊ£º"<<endl;
	print(head2);
	cout<<"ºÏ²¢ºóµÄÐÂÁ´±íΪ£º"<<endl;
	print(head1);
 
    return 0;  
}

link *creat1()  
{  
	int m=0;
    link *head1,*p1,*p2;  
    head1=NULL;  
    p1=new(link);  
    p2=p1;  
    cout<<"ÇëÊäÈëÊý×Ö£¬ÒÔÊäÈë0½áÊø:"<<endl;  
    cin>>p1->num;  
    while(p1->num!=0)  
    {  
        m++;  
        if(m==1)  
            head1=p1;  
        else  
        {  
            p2->next=p1;  
            p2=p1;  
        }  
        p1=new(link);  
        cin>>p1->num;  
    }  
    delete p1;  
    p2->next=NULL;  
  
    return head1;  
  
}

link *creat2()  
{  
	int m=0;
    link *head2,*q1,*q2;  
    head2=NULL;  
    q1=new(link);  
    q2=q1;  
    cout<<"ÇëÊäÈëÊý×Ö£¬ÒÔÊäÈë0½áÊø:"<<endl;  
    cin>>q1->num;  
    while(q1->num!=0)  
    {  
        m++;  
        if(m==1)  
            head2=q1;  
        else  
        {  
            q2->next=q1;  
            q2=q1;  
        }  
        q1=new(link);  
        cin>>q1->num;  
    }  
    delete q1;  
    q2->next=NULL;  
  
    return head2;   
}


void print(link *h)  
{  
    link *p;  
    p=h;  
    if(p==NULL)return;  
    do  
    {  
        cout<<p->num<<endl;  
        p=p->next;  
    }while(p!=NULL);  
}



void change(link *head1,link *head2)  
{  
    link *p;  
    p=head1;  
    if(p==NULL)return;  
    do  
    {   p->num;
		del(head2,p->num);
        p=p->next;  
    }while(p!=NULL); 
	merger(head1,head2);
}


link *del(link *head2,int num)
{
		link *q1,*q2;
	if(head2==NULL)
	{
		return head2;
	}
	q1=head2;
	while(num!=q1->num&&q1->next!=NULL)

	{
		q2=q1;
		q1=q1->next;
	}
	if(num==q1->num)
	{
		if(q1==head2)
			head2=q1->next;
		else
			q2->next=q1->next;
		
	}
	else
		;

		return head2;
		
}

link *merger(link *head1,link *head2)  
{  
    link *p1;  
    if(head1==NULL||head2==NULL)return NULL;  
    p1=head1;  
    while(p1->next!=NULL)  
    {  
        p1=p1->next;  
    }  
    p1->next=head2;  
    return head1;  
  
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值