数据结构实验之有序链表操作

一、 实验目的
1、 掌握有序链表的基本操作:插入、删除、查找。
2、 掌握链表遍历器的使用方法。
二、 实验内容
1、 输入n个不为零的整数作为节点元素值,遇到0代表输入结束(不创建元素值为0的节点),创建有序链表。输出整个链表。
2、 输入一个整数,将该数插入到有有序链表相应位置。输出整个链表。
3、 输入一个整数,在链表中进行搜索,输出其在链表中的第一个出现的位置。如果不存在输出0。
4、 再一次输入一个整数,在链表中进行搜索,输出其在链表中的第一个出现的位置。如果不存在输出0。
5、 再一次输入n个不为零的整数作为节点元素值,遇到0代表输入结束(不创建元素值为0的节点),创建一个新的有序链表。输出整个链表。
6、 使用链表遍历器实现上面两个有序链表的合并,输出合并后的有序链表。
7、 提示:注意单节点链表的测试。
三、 特别提醒:异常退出,多因引用非法内存造成
这个实验的程序最容易出现运行错误,非正常退出、死循环、输出结果不稳定等情况,造成的原因多是使用的非法内存,也就是一个变量没有赋值就直接引用,例如下面的引用就会造成非法引用。
ChainNode *y1 = new ChainNode;
y1->data = x;
ChainNodey2
y2=y1->link; //y1->link没有赋值,y2就指向一个随机位置
cout << y2->data<< endl; //这句话就会输出一个不确定数值。
y2->data=123; //这句话就在给一个不确定位置的内存赋值,破坏内存原来数据,造成系统严重错误。
正确做法是申请到节点后,一定要给里面的指针赋值为空:
ChainNode *y1 = new ChainNode;
y1->link = null;

代码如下

#include <iostream> 
using namespace std;
struct chainNode 
{
    int value;
    chainNode* next;

};


int main(){
	
	//1
	cout << "Input1" << endl;
	int a;int count=0;int array[1000];
	cin >> a;
	chainNode *listNode = new chainNode;
	listNode->value= 0;
	listNode->next = NULL;
	chainNode *p= listNode;
	while(a!=0){
		array[count++]=a;
        cin >> a;
	}
	for(int i=0;i<count;i++){
		for(int j=0;j<count-1-i;j++){
			if(array[j]>array[j+1]){
				int temp=array[j];
				array[j]=array[j+1];
				array[j+1]=temp;
			}
		}
	}//冒泡排序法先把元素排好 
	
	for(int i=0;i<count;i++){
		chainNode *newNode = new chainNode;
		newNode->value = array[i];
        newNode->next = NULL;
        p->next=newNode;
        p=newNode;
	}
	p=listNode->next;//重置
	cout << "Output1" << endl;
    while (p->next!=NULL) {
		cout <<p->value<<",";
		p=p->next;
	}
	cout << p->value <<endl;
	
	//2
	cout << "Input2" << endl;
	int number1;cin >> number1;
	p=listNode;//重置指针
	while(p->next!= NULL && p->next->value < number1){
		p=p->next;		
	}
	chainNode *newNode = new chainNode;
	newNode->value=number1;
	newNode->next=p->next;
	p->next=newNode;
	p=listNode->next;//重置
	cout << "Output2" << endl;
	while (p->next!=NULL) {
		cout <<p->value<<",";
		p=p->next;
	}
	cout << p->value <<endl;
	
	//3
	cout << "Input3" << endl;
	int number2; cin >> number2;
	int counter=0;
	p=listNode;
	while(p->next!= NULL && p->value != number2){
		p=p->next;counter++;		
	}
	if(p->value==number2){
	cout << "Output3" << endl;
		cout << counter << endl;
	}
	    
	else{
	cout << "Output3" << endl;
	    cout << 0 << endl;
	}
	    
	    
	//4
	cout << "Input4" << endl;
	int number3; cin >> number3;
	int counter1=0;
	p=listNode;
	while(p->next!= NULL && p->value != number3){
		p=p->next;counter1++;		
	}
	if(p->value==number3){
	cout << "Output4" << endl;
		cout << counter1 << endl;
	}
	    
	else{
	cout << "Output4" << endl;
	    cout << 0 << endl;
	}
	    
	    
	//5
	cout << "Input5" << endl;
	int b;int count1=0;int array1[1000];
	cin >> b;
	chainNode *listNode1 = new chainNode;
	listNode1->value=0;
	listNode1->next = NULL;
	chainNode *p1= listNode1;
	while(b!=0){      
		array1[count1++]=b;
        cin >> b;
	}
	for(int i=0;i<count1;i++){
		for(int j=0;j<count1-1-i;j++){
			if(array1[j]>array1[j+1]){
				int temp=array1[j];
				array1[j]=array1[j+1];
				array1[j+1]=temp;
			}
		}
	}//冒泡排序法先把元素排好 
	
	for(int i=0;i<count1;i++){
		chainNode *newNode1 = new chainNode;
		newNode1->value = array1[i];
        newNode1->next = NULL;
        p1->next=newNode1;
        p1=newNode1;
	}
	p1=listNode1->next;//重置
	cout << "Output5" << endl;
    while (p1->next!=NULL) {
		cout <<p1->value<<",";
		p1=p1->next;
	}
	cout << p1->value <<endl;
	
	//6
	chainNode *list = new chainNode;
	list->next=NULL;
	list->value=0;
	p=listNode->next;p1=listNode1->next;//重置 
	chainNode *p2=list;
	while( p!=NULL && p1!=NULL){
		
		if(p->value<p1->value){
		chainNode *newNode2 = new chainNode;
		newNode2->value = p->value;
        newNode2->next = NULL;
        p2->next=newNode2;
        p2=newNode2;
			 p=p->next; 
		}
		else{
	    chainNode *newNode2 = new chainNode;
		newNode2->value = p1->value;
        newNode2->next = NULL;
        p2->next=newNode2;
        p2=newNode2;
			p1=p1->next;
		}
		
	}
	if(p==NULL)
	 p2->next=p1;
	else if(p1==NULL)
	 p2->next=p;
	
	p2=list->next;//重置 
    while (p2->next!=NULL) {
		cout <<p2->value<<",";
		p2=p2->next;
	}
	cout << p2->value <<endl;
	system("pause");
	cout << "End0" << endl;
                delete p;delete p1;delete p2;
	return 0; 
} 

ps:应该把每一种实现写成方法的,但是我忘记了ovo。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值