C++第十次作业(动态数据结构链表的创建与使用)

文章目录:

一:C++简单学生信息链表的创建和输出——要求所创建的链表的头结点存储链表的结点数,其它结点存储各学生信息

方法一 

代码实现

运行结果

 方法二

代码实现

运行结果

二:C++设计规定函数完成学生链表的升序、插入结点、按学号查找、按姓名模糊查找、按学号删除信息、链表的输出、链表的销毁

代码实现

运行结果

三:C++创建两个存储整数的有序线性表例如LA=(1,3,5,8,10,13)和LB=(4,6,8,11,12,15,20,25),然后将LA和LB归并到新的有序线性表LC=(1,3,4,5,8,10,11,12,13,15,20,25)(相同元素只出现一次,要求使用单向链表)

算法思想

方法一:

代码实现

运行结果

方法二:结构体控制台手动输入 

代码实现

运行结果

方法三:结构体随机生成

代码实现

运行结果

方法四:代码中手动添加

代码实现

运行结果

四:C++编程实现两个一元n次多项式的和。要求使用单向链表存储多项式(按指数升序)

算法思想

代码实现

运行结果


一:C++简单学生信息链表的创建和输出——要求所创建的链表的头结点存储链表的结点数,其它结点存储各学生信息

方法一 

代码实现

#include<iostream>
using namespace std;
 
//性别
enum enumsex
{
	male,female
};

//创建结构体
typedef struct student 
{ 
	union
	{
	 int nodenum;//记录链接表节点数

	 struct//学生数据信息结构体
	 {
		int  id;				// 学号
		char name[20];			//姓名
		float score;            // 成绩
		enumsex sex;			//性别
	 };	
	};
	 struct student *next;      // 指向下一个结构体变量的指针
}student;


//开始创建链表
student *CreateList(int Head) 
{  
 student *p,*q,*head;
 int inputsex;//输入性别辅助变量

 head = p = new(student);
 head->nodenum=0;//节点数为0

 for(int i = 0;i < Head;i++) 
 {
  q = new(student);
	  cout << "请输入第" << i + 1 << "个学生的学号 : ";
			cin >> q->id;
	  cout << "请输入第" << i + 1 << "个学生的姓名 : ";
			cin >> q->name;
	  cout<<"请输入第" << i + 1 << "个学生的性别(1为女,2为男)!"<<endl;
			cin>>inputsex;
			if(inputsex==1)
			{
				q->sex=female;
			}else
			{
				q->sex=male;
			}

	  cout << "请输入第" << i + 1 << "个学生的成绩 : ";
			cin >> q->score;
			cout<<endl;

	  p->next = q;
	  p = q;
		 head->nodenum+=1;
	  p->next = NULL;
 }


	  return head;
}


//输出链表
void PrintList(student *Head) 
{
 student *p = Head->next;
 cout<<"你导入学生信息如下:"<<endl;
	 for(; p != NULL; p = p->next)
	 {
		cout<<"学号为:"<<p->id<<'\t';

		cout<<"姓名为:"<<p->name<<'\t';

		if(p->sex==female)
				cout<<"性别:"<<"女"<<"\t";
		else
				cout<<"性别:"<<"男"<<"\t";

		cout<<"成绩为:"<<p->score<<'\n';
	}
}


//释放内存
void destroy(student *head)
{
	 student *p = head,*q;
		 while(p) 
		 {
			  q = p;
			  p = q->next;
			  delete q;
		 }
}

int main() 
{    
	int renshu;
	cout<<"请输入你录入的人数:";
	cin>>renshu;

	cout<<"现在开始录入信息,请录入当前学生信息!"<<endl<<endl;
     student *head = CreateList(renshu);  // 创建

	 cout<<endl<<"亲!~~~~恭喜你录入数据成功,该链表共有"<<head->nodenum<<"条记录!"<<endl<<endl;
     PrintList(head);        // 输出
     destroy(head);          // 释放

	 system("pause");
	return 0;
}

运行结果

 方法二

代码实现

#include <iostream>
using namespace std;

enum enumsex{
	male,female
};

typedef struct student
{
	union{
		int nodenum;//记录链接表节点数
		struct{//学生数据信息结构体
			unsigned ID;//学号
			char name[16];//姓名
			enumsex sex;//性别
			float score;//成绩
		};
	};
	struct student *next;
}StuNode;

//创建链表
StuNode *CreateList(StuNode *Head){
	StuNode *pnew,*paid;//链表创建辅助指针
	int inputsex;//输入性别辅助变量
	if(Head==NULL){
		Head=new StuNode;
		Head->nodenum=0;
		Head->next=NULL;
	}
	paid=Head;
	for(;;){
		pnew=new StuNode;
		cout<<"请输入学号:";
		cin>>pnew->ID;
		if(!pnew->ID){
			return Head;
		}
		cout<<"请输入姓名:";
		cin>>pnew->name;
		cout<<"请输入性别(1为女,2为男):";
		cin>>inputsex;
		if(inputsex==1){
			pnew->sex=female;
		}else{
			pnew->sex=male;
		}
		cout<<"请输入成绩:";
		cin>>pnew->score;
		cout<<endl;

		pnew->next=NULL;
		paid->next=pnew;
		paid=pnew;

		Head->nodenum+=1;
		
	}
	return Head;
}

//输出链表
void PrintList(StuNode *Head){
	//如果链表为空
	if(Head==NULL)
		return;
	//输出链表总结点数
	cout<<"该链表存有"<<Head->nodenum<<"条记录"<<endl;
	//遍历链表,输出所有学生信息
	StuNode *pt;
	pt=Head->next;
	cout<<"学生信息为:"<<endl;
	cout<<"学号"<<"\t"<<"姓名"<<"\t"<<"性别"<<"\t"<<"成绩"<<endl;
	while(pt){
		cout<<pt->ID<<"\t"<<pt->name<<"\t";
		if(pt->sex==female)
		cout<<"女"<<"\t";
		else
		cout<<"男"<<"\t";
		cout<<pt->score<<endl;
		pt=pt->next;
	}
}

int main()
{
	cout<<"温馨提示,姓名按0建结束!"<<endl<<endl;
	StuNode *Head=NULL;
	Head=CreateList(Head);
	PrintList(Head);

	system("pause");
	return 0;
}

运行结果

二:C++设计规定函数完成学生链表的升序、插入结点、按学号查找、按姓名模糊查找、按学号删除信息、链表的输出、链表的销毁

学生信息链表的功能扩展——设计程序,要求设计的函数:

    按学号升序创建链表的函数、
    插入新结点的函数、
    按学号查找学生的函数、
    按姓名查找学生的函数(注意:姓名的查找要做到模糊查找,例如查找”张”,则能输出所有名字中含有“张”的学生信息)、
    删除指定学号学生信息的函数、
    完整链表的输出函数、
    链表的销毁函数等

代码实现

#include <iostream>
using namespace std;

enum enumsex{
	male,female
};

typedef struct student
{
	union{
		int nodenum;//记录链接表节点数
		struct{//学生数据信息结构体
			unsigned ID;//学号
			char name[16];//姓名
			enumsex sex;//性别
			float score;//成绩
		};
	};
	struct student *next;
}StuNode;


//插入结点
struct student *insert(student *head,student *s)
{
	struct student *p=head;
	while(p->next!=NULL && s->score>p->next->score)//特别注意&&左右不能写反,若s最大,最后p->next=NULL,p->next->score运行出错
	p=p->next;

		if(p->next==NULL) //s->score最大的情况 //其实两种情况可以并在一块写
		{
			p->next=s; //连接结点
			cout<<"抱歉,插入失败!"<<endl;
			s->next=NULL; //p->next就等于NULL
		}
		else
		{
			p->next=s; //连接结点
			s->next=p->next;
			cout<<"恭喜你插入成功!"<<endl;
		}
	return head ;
}


//创建链表
//按学号升序创建链表的函数
StuNode *CreateList(StuNode *Head){
	StuNode *pnew,*paid;//链表创建辅助指针
	int inputsex;//输入性别辅助变量
	if(Head==NULL){
		Head=new StuNode;
		Head->nodenum=0;
		Head->next=NULL;
	}
	paid=Head;
	for(;;){
		pnew=new StuNode;
		cout<<"请输入学号:";
		cin>>pnew->ID;
		if(!pnew->ID){
			return Head;
		}
		cout<<"请输入姓名:";
		cin>>pnew->name;
		cout<<"请输入性别(1为女,2为男):";
		cin>>inputsex;
		if(inputsex==1){
			pnew->sex=female;
		}else{
			pnew->sex=male;
		}
		cout<<"请输入成绩:";
		cin>>pnew->score;
		cout<<endl;
		
		pnew->next=NULL;
		paid->next=pnew;
		paid=pnew;

		Head->nodenum+=1;
		//Head=insert(Head,pnew);
		/*	while(paid->next&&paid->ID)
			{
				pnew=paid;
				paid=paid->next;
			}
			if(paid->ID)
			{
				paid->next=Head;
				Head->next=0;
			}
			else
			{
				Head->next=paid;
				pnew->next=Head;
			}*/ 

		//最小选择排序
		//for(pnew = paid->next ; pnew->next != NULL ; pnew = pnew->next)
		//{
		//	for(paid = pnew->next ; paid != NULL ; paid = paid->next)
		//	{
		//		if(pnew->ID > paid->ID)
		//		{
		//			int temp;
		//			temp = pnew->ID;
		//			pnew->ID = paid->ID;
		//			paid->ID = temp;
		//		}
		//	}
		//}
	}
	return Head;
}

//输出链表
void PrintList(StuNode *Head){
	//如果链表为空
	if(Head==NULL)
		return;
	//输出链表总结点数
	cout<<"该链表存有"<<Head->nodenum<<"条记录"<<endl;
	//遍历链表,输出所有学生信息
	StuNode *pt;
	pt=Head->next;
	cout<<"学生信息为:"<<endl;
	cout<<"学号"<<"\t"<<"姓名"<<"\t"<<"性别"<<"\t"<<"成绩"<<endl;
	while(pt){
		cout<<pt->ID<<"\t"<<pt->name<<"\t";
		if(pt->sex==female)
		cout<<"女"<<"\t";
		else
		cout<<"男"<<"\t";
		cout<<pt->score<<endl;
		pt=pt->next;
	}
}

//按照学号查找
struct student *searchID (student *Head)
{
	struct student *p=Head->next;
	int num;
	cout<<"请输入要查找的学号:";
	cin>>num;
	while(p!=NULL&&p->ID!=num)
	{
		p=p->next;
	}
	if(p==NULL) 
	{
		cout<<"找不到符合条件的结点!"<<endl;
		return NULL; //查找不到返回空指针
	}
	if(p->ID==num)
	{
		cout<<"找到符合条件的结点!该结点为:"<<"学号:"<<p->ID<<"  "<<
			"姓名:"<<p->name<<"  "
			<<"性别:"<<p->sex<<"  "
			<<"成绩:"<<p->score<<endl;
		return p; //返回查找到的指针
	}
}

//按照姓名查找
struct student *searchname (student *Head)
{
	struct student *p1=Head->next;
	char name[10];
	cout<<"请输入要查找姓名:";
	cin>>name;
	while(p1!=NULL&&p1->name!=name)
	{
		p1=p1->next;
	}
	if(p1==NULL) 
	{
		cout<<"找不到符合条件的结点!"<<endl;
		return NULL; //查找不到返回空指针
	}
	if(p1->name==name)
	{
		cout<<"找到符合条件的结点!该结点为:"<<"学号:"<<p1->ID<<"  "<<
			"姓名:"<<p1->name<<"  "
			<<"性别:"<<p1->sex<<"  "
			<<"成绩:"<<p1->score<<endl;
		return p1; //返回查找到的指针
	}
}


//删除结点
struct student *delete_ID(student *head,int num_x)
{
	struct student *p1=head->next,*p2=head;
	while(p1!=NULL&&p1->ID!=num_x) //特别注意&&左右条件不能调换,若调换如果p1指向NULL时p1->num运行出错
	{
		p2=p1;
		p1=p1->next;
	}
	if(p1==NULL) //特别注意两个if不能调换,若调换如果p1指向NULL时,p1->num运行出错
			cout<<"找不到符合删除要求的结点!"<<endl;
		if(p1->ID==num_x)
			{
			p2->next=p1->next;
			free(p1);
			cout<<"结点删除成功!"<<endl;
		}
	return head;
}

//销毁链表
StuNode *DestroyList(StuNode *Head)
{	StuNode *pt;
	do
	{	pt=Head;
		Head=Head->next;
		delete pt;
	}while(Head);
	cout<<"销毁链表成功!"<<endl<<endl;
	return Head;
}

//排序
void sort(student *head)
{
	StuNode *p,*s;//链表创建辅助指针
	student *m=head;

	if(head->next==NULL || head->next->next==NULL)
	{
		cout<<"链表排序完成!"<<endl<<endl;
		return;
	}

	student *p=head->next;
	student *s=p->next;
	student *k=NULL;
while(k != head->next->next)
{
	while(s!=k)
	{
		if(p->ID&&s->ID> 0)
		{
			p->next=s->next;     
			s->next=p;
			m->next=s;
			m=s;
			s=p->next;
		}
		else
		{
			m=p;
			p=s;
			s=s->next;
		}
	}

	k=p;
	m=head;
	p=m->next;
	s=p->next;
	}
cout<<"链表排序完成!"<<endl<<endl;
}


int main()
{
	int id;//学号
	int num;//姓名
	int Sex;//性别
	float score;//成绩
	struct student *p;

	cout<<"温馨提示,姓名按0建结束!"<<endl<<endl;
	StuNode *Head=NULL;
	Head=CreateList(Head);
	PrintList(Head);

	//searchID(Head);
	//searchname(Head);

	/*cout<<"请输入你要删除的学号:"<<endl;
	cin>>num;
	delete_ID(Head,num)*/;

	//给p赋值
	//cout<<"请输入你要插入的学号:";
	//cin>>id;
	//cout<<"请输入你要插入的姓名:";
	//cin>>num;
	//cout<<"请输入你要插入的性别:";
	//cin>>Sex;
	//cout<<"请输入你要插入的成绩:";
	//cin>>score;
	//p=(struct student*)malloc( sizeof(struct student) );
	//if(p==NULL)
	//{
	//	cout<<"申请该结点失败!"<<endl;
	//	exit (0) ;
	//}
	///*p->ID=id;
	//p->score=score; 
	//p->name=num;
	//p->sex=Sex;*/
	//insert(Head,p);

	cout<<"开始销毁链表:"<<endl;
	DestroyList(Head);
	system("pause");
	return 0;
}

可参考

#include <iostream>
#include <cstring>

using namespace std;

typedef struct student {
    unsigned ID;
    char name[16];
    float score;
    struct student *next;
} StuNode;

StuNode *CreateList(StuNode *Head) {
    StuNode *pnew, *pend, *ps, *pe;
    cout << "开始创建学生链表,输入学号为0或负则停止:" << endl;
    for (;;) {
        //创建新结点
        pnew = new StuNode;
        pnew->next = NULL;

        //输入新结点学号
        cout << "请输入学生学号" << endl;
        cin >> pnew->ID;

        //如果学号==0则终止
        if (pnew->ID == 0) {
            break;
        }

        //输出新结点姓名和成绩
        cout << "请输入学生姓名" << endl;
        cin >> pnew->name;

        cout << "请输入学生成绩" << endl;
        cin >> pnew->score;

        //如果当前链表为空,新结点如何处理?
        if (Head == NULL) {
            Head = pnew;
            pend = pnew;
        } else {
            //如果新结点学号<头结点学号,如何处理?
            if (pnew->ID < Head->ID) {
                pnew->next = Head;
                Head = pnew;
            } else
                //否则如果新结点学号>尾结点学号,如何处理?

            if (pnew->ID>pend->ID) {
                pend->next = pnew;
                pend = pnew;
            } else
                //否则(新结点学号介于首尾结点之间)
            {
                ps = Head;
                pe = ps->next;
                //操作见后面的示意图
                while (true) {
                    if (ps->ID <= pnew->ID && pe->ID >= pnew->ID) {
                        ps->next = pnew;
                        pnew->next = pe;

                        break;
                    }
                    ps = pe;
                    pe = ps->next;
                }
            }
        }
    }
    return Head;
}

void PrintList(StuNode *Head) {    //如果链表为空,如何处理?
    if (Head == NULL) {
        cout << "空链表" << endl;
        return;
    }
    StuNode *ptemp;
    ptemp = Head;
    cout << "学号\t姓名\t成绩" << endl;
    while (ptemp != NULL) {
        cout << ptemp->ID << "\t";
        cout << ptemp->name << "\t";
        cout << ptemp->score << "\t" << endl;
        ptemp = ptemp->next;
    }
}

StuNode *InsertList(StuNode *Head) {
    //如果现有链表为空链表,询问是否创建
    //是则调用CreateList( )函数,否则返回
    if (Head == NULL) {
        unsigned i = 0;
        cout << "当前链表为空,是否创建链表,输入1创建、0返回" << endl;
        cin >> i;
        if (i == 0) {
            return Head;
        }
        return CreateList(Head);
    }
    //如果当前链表非空,操作与CreateList( )函数类似
    StuNode *pnew, *pend, *ps, *pe;
    //创建新结点
    pnew = new StuNode;
    pnew->next = NULL;

    //输入新结点学号
    cout << "请输入学生学号" << endl;
    cin >> pnew->ID;

    //如果学号==0则退出增加
    if (pnew->ID == 0) {
        return Head;
    }

    //输出新结点姓名和成绩
    cout << "请输入学生姓名" << endl;
    cin >> pnew->name;

    cout << "请输入学生成绩" << endl;
    cin >> pnew->score;

    pnew->next = NULL;

    pend = Head;
    while (pend->next != NULL) {
        pend = pend->next;
    }

    //如果新结点学号<头结点学号,如何处理?
    if (pnew->ID < Head->ID) {
        pnew->next = Head;
        Head = pnew;
    } else if (pnew->ID > pend->ID) {
        //否则如果新结点学号>尾结点学号,如何处理?
        pend->next = pnew;
    } else {
        //否则(新结点学号介于首尾结点之间)
        ps = Head;
        pe = ps->next;
        //操作见后面的示意图
        while (true) {
            if (ps->ID <= pnew->ID && pe->ID >= pnew->ID) {
                ps->next = pnew;
                pnew->next = pe;
                break;
            }
            ps = pe;
            pe = ps->next;
        }
    }
    return Head;
}

StuNode *DeleteID(StuNode *Head) {    //如果链表为空,如何处理?
    if (Head == NULL) {
        cout << "链表为空" << endl;
        return Head;
    }
    StuNode *p, *temp;
    int delID;
    //输入要删除的学号delID
    cout << "输入要删除学生的学号" << endl;
    cin >> delID;
    temp = Head;
    //当temp->ID!=delID与temp->next!=NULL时
    while (temp->ID != delID && temp->next != NULL) {
        p = temp;
        temp = temp->next;
    }
    if (temp->ID == delID) {
        if (temp == Head) {
            //(1)待删除结点是头结点,如何处理?temp==Head
            Head = temp->next;
        } else if (temp->next == NULL) 
		{
            //(2)待删除结点是尾结点,如何处理?temp->next==NULL
            p->next = NULL;
        } else {
            //(3)等删除结点是中间结点,如何处理?
            p->next = temp->next;
        }
        delete temp;
    } else {
        //否则说明链表中不存在delID这个学号的结点,如何处理?
        cout << "学号 " << delID << " 的学生不存在于链表之中" << endl;
    }
    return Head;
}

void SearchNum(StuNode *Head) {
    if (Head == NULL) {
        cout << "链表为空" << endl;
        return;
    }

    unsigned num = 0;
    cout << "请输入需要查找学生的学号" << endl;
    cin >> num;

    StuNode *temp = Head;
    StuNode *Stu = NULL;

    while (temp != NULL) {
        if (temp->ID == num) {
            Stu = temp;
            break;
        }
        temp = temp->next;
    }
    if (Stu != NULL) {
        cout << "学号\t姓名\t成绩" << endl;
        cout << Stu->ID << "\t";
        cout << Stu->name << "\t";
        cout << Stu->score << "\t" << endl;
    } else {
        cout << "未找到学号为" << num << "的学生" << endl;
    }
}

void SearchName(StuNode *Head) {
    if (Head == NULL) {
        cout << "链表为空" << endl;
        return;
    }

    char name[16];
    cout << "请输入需要查找学生的姓名" << endl;
    cin >> name;

    StuNode *temp = Head;

    bool isHas = false;


    while (temp != NULL) {
        string s = temp->name;
        if (s.find(name, 0) != string::npos) {
            isHas = true;
            cout << "学号\t姓名\t成绩" << endl;
            cout << temp->ID << "\t";
            cout << temp->name << "\t";
            cout << temp->score << "\t" << endl;
        }

        temp = temp->next;
    }
    if (!isHas) {
        cout << "链表中未找到学生信息" << endl;
    }

}

StuNode *DestroyList(StuNode *Head) {
    StuNode *temp;
    while (Head != NULL) {
        temp = Head->next;
        Head = NULL;
        Head = temp;
    }
    return Head;
}


void StatisticsFractionCount(StuNode *Head) {
    if (Head == NULL) {
        cout << "链表为空" << endl;
        return;
    }
    unsigned int gradeA = 0;
    unsigned int gradeB = 0;
    unsigned int gradeC = 0;
    unsigned int gradeD = 0;
    unsigned int gradeE = 0;
    StuNode *temp = Head;
    while (temp != NULL) {

        if(temp->score >= 90){
            gradeA++;
        } else if(temp->score < 90 && temp->score >= 80){
            gradeB++;
        }else if(temp->score < 80 && temp->score >= 70){
            gradeC++;
        }else if(temp->score < 70 && temp->score >= 60){
            gradeD++;
        }else if(temp->score < 60){
            gradeE++;
        }
        temp = temp->next;
    }

    cout<<"成绩在100-90的学生人数为:"<<gradeA<<endl;
    cout<<"成绩在89-80的学生人数为:"<<gradeB<<endl;
    cout<<"成绩在79-70的学生人数为:"<<gradeC<<endl;
    cout<<"成绩在69-60的学生人数为:"<<gradeD<<endl;
    cout<<"成绩在60以下的学生人数为:"<<gradeE<<endl;

}


void PrintMaxAndMinScoreStudentInfo(StuNode *Head) {
    if (Head == NULL) {
        cout << "链表为空" << endl;
        return;
    }
    StuNode *max, *min, *temp;
    max = min = Head;
    temp = Head->next;

    while (temp != NULL) {
        if (max->score < temp->score) {
            max = temp;
        } else if (min->score > temp->score) {
            min = temp;
        }
        temp = temp->next;
    }

    cout << "最高成绩学生信息" << endl;
    cout << "学号\t姓名\t成绩" << endl;
    cout << max->ID << "\t";
    cout << max->name << "\t";
    cout << max->score << "\t" << endl;
    cout << "最低成绩学生信息" << endl;
    cout << "学号\t姓名\t成绩" << endl;
    cout << min->ID << "\t";
    cout << min->name << "\t";
    cout << min->score << "\t" << endl;
}


void PrintAvgScore(StuNode *Head) {
    if (Head == NULL) {
        cout << "链表为空" << endl;
        return;
    }
    double allScore = 0;
    unsigned int stuCount = 0;
    StuNode *temp = Head;
    while (temp != NULL) {
        stuCount++;
        allScore += temp->score;
        temp = temp->next;
    }
    double avg = allScore / (stuCount * 1.0);
    cout << "平均成绩为:" << avg << endl;

}


int main() {

    unsigned op = 0;
    StuNode *Head = NULL;

    bool flag = true;

    while (flag) {
        cout << "1.初始化创建链表\t2.增加学生" << endl;
        cout << "3.按学号查找\t4.按姓名查找" << endl;
        cout << "5.按学号删除学生\t6.打印链表信息" << endl;
        cout << "7.统计各分数段学生人数\t8.输出最低成绩信息和最高成绩信息" << endl;
        cout << "9.输出平均成绩信息\t10.销毁链表" << endl;
        cout << "11.退出" << endl;
        cout << "输入相应命令进行操作:";
        cin >> op;

        switch (op) {
            case 1:
                Head = CreateList(Head);
                break;
            case 2:
                Head = InsertList(Head);
                break;
            case 3:
                SearchNum(Head);
                break;
            case 4:
                SearchName(Head);
                break;
            case 5:
                Head = DeleteID(Head);
                break;
            case 6:
                PrintList(Head);
                break;
            case 7:
                StatisticsFractionCount(Head);
                break;
            case 8:
                PrintMaxAndMinScoreStudentInfo(Head);
                break;
            case 9:
                PrintAvgScore(Head);
                break;
            case 10:
                Head = DestroyList(Head);
                break;
            case 11:
                flag = false;
                break;
            default:
                flag = false;
                break;
        }
    }


    system("pause");
    return 0;
}

运行结果

三:C++创建两个存储整数的有序线性表例如LA=(1,3,5,8,10,13)和LB=(4,6,8,11,12,15,20,25),然后将LA和LB归并到新的有序线性表LC=(1,3,4,5,8,10,11,12,13,15,20,25)(相同元素只出现一次,要求使用单向链表)

算法思想

因为都是两个有序的线性表,所以不需要排序

   1.两个有序线性表同时开始从头开始遍历,各出一个元素进行有序比较

   2.把小的元素放到新线性表LC中

   3.重复上面操作,直到其中一个表被取完

   4.因为是有序的,直接把剩下那个表中没有进行比较的,放在LC的后面

方法一:

代码实现

#include<iostream>
#include<cstring>
using namespace std;

typedef struct Data
{
	int v;				//数据域
	struct Data *next; //指针域
}IntNode;

//创建一个链表存放n个整数
IntNode *CreateList(IntNode *Head,int n)//存放几个整数
{
	IntNode *pnew = NULL, *pend = NULL;//首先将链表清空
	for (int i = 1; i <= n; i++)
	{	
		pnew = new IntNode; //申请一个新的空间
		pnew->next = NULL; //空间的下一个结点为空

		cin >> pnew->v;//输入值
			if (Head==NULL)//如果头结点为空
			{
				Head = pnew;//那么就申请一个
			}	
			else//如果头结点不为空
			{
				pend->next = pnew;//继续创建
			} 
			pend = pnew;//直到结束
	}
	return Head;
}

//输出链表
void PrintList(IntNode *Head)
{
	if (Head == NULL)
		return;

	IntNode *pt = Head;
		while (pt)
		{
			cout << pt->v << ',';//输出值
			pt=pt->next;//依次输出
		}
		cout << endl;
}

//合并链表
IntNode *MergeList(IntNode *HeadA,IntNode *HeadB,IntNode *HeadC)
{
	IntNode *pnew = NULL, *pend = NULL;
	IntNode *pa = HeadA, *pb = HeadB;

	while (pa&&pb)//当HeadA和HeadB都不为空时
	{
		pnew = new IntNode; pnew->next = NULL;//清空
		if (pa->v<pb->v)		 //当A<B,那么就A先放
		{
			pnew->v = pa->v; 
			pa = pa->next;
		}
		else if (pa->v == pb->v) //当A=B,那么就任选一个,比如A先放;已经存在一个了那就下一个B其次的放
		{
			pnew->v = pa->v; 
			pa = pa->next; 
			pb = pb->next;//这里很重要,就是为了避重
		}
		else//当A>B,那么就B先放
		{
			pnew->v = pb->v; 
			pb = pb->next;
		}

		//依次的存放
			if (HeadC==NULL)
			{
				HeadC = pnew;
			}
			else
			{
				pend->next = pnew;
			}
			pend = pnew;
	}

	//这里如果比较到某一个已经比完了
	while (pa)//当HeadA不为空,当HeadB为空时
	{
		pnew = new IntNode; 
		pnew->next = NULL;//先清空

		pnew->v = pa->v; //把A中的值传入
		pa = pa->next;

		pend->next = pnew; //到头了
		pend = pnew;
	}
	while (pb)//当HeadB不为空,当HeadA为空时
	{
		pnew = new IntNode; 
		pnew->next = NULL;

		pnew->v = pb->v; 
		pb = pb->next;
		pend->next = pnew; 
		pend = pnew;
	}
	return HeadC;
}
 

int main()
{

	IntNode *HeadA = NULL, *HeadB = NULL, *HeadC = NULL;

	cout << "请输入第一个链表:" << endl;
	HeadA = CreateList(HeadA, 6);//6个整数
	PrintList(HeadA);
	cout << "请输入第二个链表:" << endl;
	HeadB = CreateList(HeadB, 8);//5个整数
	PrintList(HeadB);

	cout << endl <<  "合并后的链表C为:" << endl;
	HeadC = MergeList(HeadA, HeadB, HeadC);
	PrintList(HeadC);
 
	 system("pause");
	 return 0;
}

运行结果

方法二:结构体控制台手动输入 

代码实现

#include <iostream>
using namespace std;
#define MAX 20
 
//定义结构体
typedef struct data
{
    unsigned  num[MAX];
    int next;
}DataNode;
//int La[]={1,3,5,8,10,13};                //定义线性表La; 
//int Lb[]={4,6,8,11,12,15,20,25};		   //定义线性表Lb;

//创建链表
void CreatList(DataNode *L)
{
    int i=0,c;
    while(1)
    {
		cin >> c;
        if(c==-8080)
            break;
        L->num[i] = c;
		i++;
        L->next++;
    }
}

//合并链表
DataNode MergeList(DataNode HeadLA,DataNode HeadLB,DataNode HeadLC)
{
    int i=0,j=0,k=0;
    while(i <= HeadLA.next && j <= HeadLB.next)
    {
        /*处理本列表里的重复*/
        if (k >= 1 && HeadLC.num[k-1] == HeadLA.num[i]) {
            i++;
            continue;
        }
        /*处理本列表里的重复*/
        if (k >= 1 && HeadLC.num[k-1] == HeadLB.num[j]) {
            j++;
            continue;
        }
 
        if(HeadLA.num[i] < HeadLB.num[j])
        {
            HeadLC.num[k] = HeadLA.num[i];
            i++;
            k++;
            HeadLC.next++;
        }
        else if(HeadLA.num[i]>HeadLB.num[j])
        {
            HeadLC.num[k]=HeadLB.num[j];
            j++;
            k++;
            HeadLC.next++;
        }
        else
        {
            HeadLC.num[k] = HeadLA.num[i];
            i++;
            j++;
            k++;
            HeadLC.next++;
        }
    }
    while(i <= HeadLA.next)    
    {
        HeadLC.num[k]=HeadLA.num[i];
        i++;k++;
        HeadLC.next++;
    }
    while(j <= HeadLB.next)   
    {
        HeadLC.num[k]=HeadLB.num[j];
        j++;k++;
        HeadLC.next++;
    }
    return HeadLC;
}

//打印链表
void PrintList(DataNode L)
{
    int i;
    for(i=0;i < L.next;i++)
		cout<<L.num[i]<<"  ";
	cout<<L.num[i]<<"  ";
}


int main()
{
    DataNode HeadLA,HeadLB,HeadLC;
    HeadLA.next=-1;
    HeadLB.next=-1;
    HeadLC.next=-1;

	cout<<"注意,程序结尾以-8080结束!"<<endl;
    //输入LA
	cout<<"请输入线性表LA:"<<endl;
    CreatList(&HeadLA);
    getchar();
	cout<<endl;

    //输入LB
	cout<<"请输入线性表LB:"<<endl;
    CreatList(&HeadLB);
    HeadLC=MergeList(HeadLA,HeadLB,HeadLC);
	cout<<endl;

	cout<<"将线性表LA、LB合并后的线性表LC为:";
    PrintList(HeadLC);
	cout<<endl;

	cout<<endl;
	system("pause");
    return 0;
}

运行结果

方法三:结构体随机生成

代码实现

#include <iostream>
#include <ctime>
#include <iomanip>
using namespace std;
 
//定义结构体
typedef struct data
{
	unsigned  num;
	struct data *next;
}DataNode;

// 创建结点数为n的链表,返回链表头
DataNode *CreateList(int n)
{
	DataNode *Head,*p,*q;
	Head = p = new DataNode;
	Head->num = 0;
	for (short i = 0; i < n; i++)
	{
		q = new DataNode;
		q->num = (unsigned)rand() % n + n/2;
		p->next = q;
		p = q;
	}
	p->next = Head;
	return Head;
}


//上升排序
void RiseSort(DataNode *Head)
{
	DataNode *p,*s,*pt;
	p = Head;
	s = p->next;
	while(p->next != Head) 
	{
		while(s->next != Head)
		{
			if(p->next->num > s->next->num) 
			{
				pt = p->next;
				p->next = s->next;
				s->next = p->next->next;
				p->next->next = pt;
			}else
			{
				s = s->next;
			}
		}
		p = p->next;
		s = p->next;
	}
}

// 去除相同的集合元素
void Simplification(DataNode *Head)
{
	DataNode *p,*q,*s;
	p = Head->next;
	q = p->next;
	while(q != Head)
	{
		if(p->num == q->num)
		{
			p->next = q->next;
			s = q;
			q = q->next;
			delete s;
		}else
		{
			p = p->next;
			q = q->next;
		}
	}
}

//创建线性表
DataNode *CreateDataNode(int n) 
{
	DataNode *Head;
	Head = CreateList(n);
	RiseSort(Head);
	Simplification(Head);
	return Head;
}

//插入结点
void InsertNode(DataNode *Head,short num) 
{
	DataNode *t,*p = Head;
	while(p->next != Head)
	{
		if(p->next->num == num)
		{
			return;
		}
		if (p->next->num < num)
		{
			p = p->next;
		}else
		{
			t = new DataNode;
			t->num = num;
			t->next = p->next;
			p->next = t;
			return;
		}
	}
	t = new DataNode;
	t->num = num;
	p->next = t;
	t->next = Head;     // 插入在链表尾的处理
}

//求一共的A∪B
DataNode *MergeList(DataNode *A,DataNode *B)
{
	DataNode *Head,*pa,*pb,*pc,*qc;
	Head = pc = new DataNode;
	pa = A->next;
	while(pa != A)
	{
		qc = new DataNode;
		qc->num = pa->num;
		pc->next = qc;
		pc = qc;
		pa = pa->next;
	}
	pc->next = Head;
	pb = B->next;
	while(pb != B)
	{
		InsertNode(Head,pb->num);
		pb = pb->next;
	}
	return Head;
}

//求两个都有的A∩B
DataNode *MutualDataNode(DataNode *A,DataNode *B) 
{
	DataNode *C,*pa,*pb,*pc,*qc;
	C = pc = new DataNode;
	pc->num = 0;
	pa = A->next;
	pb = B;
	while(pa != A)
	{
		pb = B->next;
		while(pb != B)
		{
			if(pb->num == pa->num)
			{
				qc = new DataNode;
				qc->num = pb->num;
				pc->next = qc;
				pc = qc;
			}
			pb = pb->next;
		}
		pa = pa->next;
	}
	pc->next = C;
	return C;
}

//打印线性表
void PrintList(DataNode *Head)
{
	DataNode *p = Head->next;
	short counter = 0;
	while(p != Head)
	{
		if(counter%10 == 0)
		{
			cout << "\t";
		}
		cout<<setw(5)<< p->num;
		counter++;
		p = p->next;
	}
	cout << endl;
}

//释放头结点
void freeheap(DataNode *Head)
{
	DataNode *p,*q;
	p = Head;
	q = p->next;
	while(q != Head)
	{
		p = q;
		q = p->next;
		delete p;
	}
	free(Head);
}


int main()
{
	DataNode *A,*B,*C,*D;
	//DataNode *A,*B,*C,*D;
	srand(time(NULL));


	A = CreateDataNode(6);
	//int A[]={1,3,5,8,10,13};			//定义线性表La; 
	cout << "线性表LA中的元素有:"<<endl;	
	PrintList(A);
		cout<<endl;



	B = CreateDataNode(8);
	//int B[]={4,6,8,11,12,15,20,25};		//定义线性表Lb;
	cout<< "线性表LB中的元素有:"<<endl;	
	PrintList(B);
		cout<<endl;

	C = MutualDataNode(A,B);

	cout  << "LA、LB公共有的元素有:"<<endl ;	
	PrintList(C);
		cout<<endl;

	cout << "将LA、LB合并后的LC元素有: "<<endl;	
	D = MergeList(A,B);
	PrintList(D);
		cout<<endl;
	
	freeheap(A);
	freeheap(B);
	freeheap(C);
	freeheap(D);

	system("pause");
	return 0;
}

运行结果

方法四:代码中手动添加

代码实现

#include<iostream>
using namespace std;
#define N 30

int La[]={1,3,5,8,10,13};                //定义线性表La; 
int Lb[]={4,6,8,11,12,15,20,25};		 //定义线性表Lb;

int Lc[N];                               //定义线性表Lc,此时Lc是空表; 
int La_Len=sizeof(La)/sizeof(La[0]);     //获得线性表La的表长; 
int Lb_Len=sizeof(Lb)/sizeof(Lb[0]);     //获得线性表Lb的表长;
int Lc_Len=0;                            //定义线性表Lc的表长为0; 

int GetElem(int a[],int n)               //获得线性表中的元素;  
{
	return a[n-1];                       //返回对应的数组元素值; 
}

void ListInsert(int Lc[],int x1)         //实现元素的插入操作; 
{
	Lc[Lc_Len]=x1;
	Lc_Len++;                            //每插入一次,表长加1,为下次插入留下空位; 
}

void MergeList(int La[],int Lb[],int Lc[])  //功能:合并两个有序的线性表; 
{
	int i,j;
	i=j=1;                                 //线性表元素的位序,不是数组下标; 
	while((i<=La_Len)&&(j<=La_Len))        //while循环执行的条件; 
	{
		if(GetElem(La,i)<=GetElem(Lb,j))   //比较ai和bj大小; 
		{
			ListInsert(Lc,GetElem(La,i));  //实现元素的插入; 
			i++;                           //为遍历下一个元素作准备; 
		}
		else
		{
			ListInsert(Lc,GetElem(Lb,j));
			j++;
		}
	}
	while(i<=La_Len)             //表明线性表La中还有元素,把余下的元素都插到Lc中; 
	{
		ListInsert(Lc,GetElem(La,i));
		i++;
	}
	while(j<=Lb_Len)          //表明线性表Lb中还有元素,把余下的元素都插到Lc中;
	{
		ListInsert(Lc,GetElem(Lb,j));
		j++;
	}
}

int main()
{
	//int i,j,m,n,k;
	//int La[N],Lb[N];
	//cout <<"请输入线性表A的元素:"<<endl;
	//cout <<"----------------------"<<endl;
	//for(i=0;i<n*m;i++)
	//{
	//	cout << "请输入线性表A的第"<<i+1<<"个元素"<<endl;
	//	cin >>La[i];
 //
	//}
	//cout <<"----------------------"<<endl;
	//
	//cout <<"请输入线性表B的元素:"<<endl;
	//cout <<"----------------------"<<endl;
	//for(i=0;i<n*k;i++)
	//{
	//	cout << "请输入线性表B的第"<<i+1<<"个元素"<<endl;
	//	cin >>Lb[i];
	//}
	//cout <<"----------------------"<<endl;


	cout<<"La中的元素:";
	for(int r=0;r<La_Len;r++)
	{
		cout<<La[r]<<" ";
	}
	cout<<endl;
	cout<<"Lb中的元素:";
	for(int r1=0;r1<Lb_Len;r1++)
	{
		cout<<Lb[r1]<<" ";
	}
	cout<<endl;
	MergeList(La,Lb,Lc);
	cout<<"Lc中的元素:";
	for(int i=0;i<Lc_Len;i++)
	{
		if (Lc[i]==Lc[i+1])
		{
			continue;
		}
		cout<<Lc[i]<<" ";
	}
	cout<<endl;

	system("pause");
	return 0;
} 

运行结果

四:C++编程实现两个一元n次多项式的和。要求使用单向链表存储多项式(按指数升序)

算法思想

 一元多项式相加

1.首相用链表创建两个一元n次多项式
          每个结点的数据包含两个:系数、指数
 
2.按照指数升序,如果函数录入为乱序,这里需要一个排序函数

3.多项式相加求和

          当指数相等时,系数相加,存入新的链表

          当指数不相等时,比较大小,存入新的链表

4.输出函数

        4.1 p的后继结点不为空时,p等于它的后继结点,继续循环

             两式相加为常数(指数为0)怎么处理——只输出系数

             两式相加系数为1(系数为1.指数为1)怎么处理——不显示系数

             系数不为0指数为1的情况——不显示指数x,2x,3x

             系数为1指数不为0的情况——不显示系数x^2,x^3

             两个多项式相加的和为0时——直接输出空

             系数不为1指数不为0的情况——2x^3,3x^2

     4.2 这里还要判断最后一个多项式是上面的那种类型,因为最后一个可能存在,但是已经推出循环

            系数为0,指数不为0

            系数为1,指数为1

            系数为1,指数不为1

            系数为1,指数不为0

            系数为0

            系数不为1,指数不为0

代码实现

#include <iostream>
using namespace std;
 
 //构造定义结构体变量
typedef struct poly
{
	int coe;	//系数
	int exp;		//指数
	poly *next; 
}poly;


//创建单链表存储多项式的各项式[尾插法]
poly *CreateList()
{
	poly *head,*p,*q;
	
	int n;				//确定每一个多项式的个数
	int i = 0;			//输入的第几个多项式的系数或指数 

	head = (poly*)malloc(sizeof(poly));			//给head分配内存空间
	//poly *head=new poly;

	head->next = NULL;	//head初始化为空表 	
	q = head;			//让q等于head的头节点 
	
	cout<<"请输入你想要多少个多项式:"<<endl;
	cin >>n;
	
	for(i = 0;i < n;i++)
	{
		//p = (poly*)malloc(sizeof(poly));		//给p分配内存空间 		
		poly *p=new poly;

		cout<<"请输入第:"<<i+1<<"项的系数"<<endl;
		cin >>p->coe;
	
		cout<<"请输入第:"<<i+1<<"项的指数"<<endl;
		cin >>p->exp;
		
		p->next = q->next;	
		q->next = p;		
		q = q->next; 

		cout<<endl;
	}
	return head;
}

//输出函数,输出单链表
void print(poly *head)
{
	poly *p;
	
	p = (poly*)malloc(sizeof(poly));	
	//poly *p=new poly;
	p = head->next;

	while(p->next != NULL)								//如果p的后继节点不为空时执行下列语句
	{								 
		if(p->coe != 0 && p->exp == 0)		//系数不为0指数为0的情况(常数)
		{	
			cout<<"+"<<p->coe;						//所以只输入系数		
		}
       
       else if(p->coe == 1 && p->exp == 1) //系数为1指数为1的情况 	
	    {	
			cout<<"x+";										//不显示系数
	    }	
		
		else if(p->coe != 0 && p->exp == 1)//系数不为0指数为1的情况
		{ 
			cout<<p->coe<<"x+";						
		}
		
		else if(p->coe == 1 && p->exp != 0) //系数为1指数不为0的情况
		{
			cout<<"x^"<<p->exp<<"+";
		}
		
		else if(p->coe == 0)					 //两个多项式相加的和为0时的情况,不输出 
		{					 	
			cout<<"";		
		}
		
		else if(p->coe != 1 && p->exp != 0) //系数不为1指数不为0的情况
		{ 		
			cout<<p->coe<<"x^"<<p->exp<<"+";		
		}
		
		p = p->next;									//让p等于它的后继结点,继续循环
	}

	//判断最后一个多项式的类型 
	//当p为最后一个结点时,p->next已经是空,就会跳出循环,最后一个结点的数据就会不运行出来
	if(p->exp == 0 && p->coe != 0)         //系数为0,指数不为0
		{	
			cout<<p->coe;
		}	

        else if(p->coe == 1 && p->exp == 1) //系数为1,指数为1
		{
			cout<<"x+";		
		}
		
		else if(p->exp == 1 && p->coe != 0)  //系数为1,指数不为1
		{
			cout<<p->coe<<"x";	
		}
		
		else if(p->coe == 1 && p->exp != 0)   //系数为1,指数不为0
		{
			cout<<"x^"<<p->exp;	
		}
		
		else if(p->coe == 0)	                   //系数为0
		{		
			cout<<"0";
		}
		
		else if(p->coe != 1 && p->exp != 0)   //系数不为1,指数不为0
		{
			cout<<p->coe<<"x^"<<p->exp;	
		}
}

//排序
void paixu(poly *head)//将多项式按升幂排序
{ 	
	poly *p,*q;
	
	int temp,temp1;
	
	for(p=head->next;p!=NULL;p=p->next)		//运用了两个for循环
	{		
		for(q=p->next;q!=NULL;q=q->next)	//q为p的后继结点
		{			
			if(p->exp > q->exp)	//如果p的指数比q的指数大,也就是前一项的指数比后一个指数大,那么交换它们的指数和系数
			{		
				temp = p->exp;			
				p->exp = q->exp;		
				q->exp = temp;		
				temp1 = p->coe;			
				p->coe = q->coe;			
				q->coe = temp1;		
			}
		} 
	}
} 

//多项式相加
poly *SumPoly(poly *&Heada,poly *Headb)			//一元多项式相加 (将一元多项式相加的结果存放在Heada中) 
{	
	poly *a,*b,*p;
	
	a = Heada->next;	
	b = Headb->next;
	p = Heada;
	
	while(a != NULL && b != NULL)
	{		
		if(a->exp == b->exp)
		{	
			a->coe = a->coe+b->coe;		
			p->next = a;
			p = p->next;			
			a = a->next;		
			b = b->next;		
		}	
		else if(a->exp < b->exp)
		{			
			p->next = a;		
			p = p->next;		
			a = a->next;		
		}	
		else
		{			
			p->next = b;			
		    p = p->next;		    
		    b = b->next;		
		}		
	}
	
	if(a != NULL)							//比较结束之后a或b如果有一个还未空就执行下述语句
	{		
			p->next = a;		
	}	
	else
	{			
		p->next = b;		
	}
	return Heada;	
}

	
 
int main()
{
	 poly *Heada,*Headb,*Headc;

	//创建多项式
	Heada = CreateList();
	Headb = CreateList();

	//排序
	paixu(Heada);
	paixu(Headb);
	
	//输出多项式A、B
	 cout<<endl<<"你输入的多项式A为:"<<endl;
	 print(Heada);
	 cout<<endl<<"你输入的多项式B为:"<<endl;
	 print(Headb);

	//求和输出
	cout<<endl;
	cout<<endl;
	cout<<"合并后的多项式C为:";
	Headc = SumPoly(Heada,Headb);//相加
	print(Headc);//输出
	cout<<endl;

	system("pause");
	return 0;
}

运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘鑫磊up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值