数据结构之(链表)代码

LinkNode.h

#include "stdafx.h"

typedef int elemtype;//int可以换成任意基本数据类型
typedef struct lnode//链表结点
{
	elemtype data;
	struct lnode *next;
	int length;
}lnode;

lnode *create_list();//创建链表
void out_list(lnode *l);//输出元素
lnode *insert_list(lnode *l);//插入元素
void delete_list(lnode *l);//删除第i个元素
void locate_list(lnode *l);//查找元素
int judge_input(int min,int max);/判断输入的合法性,输入min 到max之间的值

LinkNode.cpp

#include "stdafx.h"
#include "LinkNode.h"
#include <iostream>
using namespace std;

lnode* create_list()//创建链表
{
	lnode *head,*p1,*p2;
	head=new lnode;//new申请的空间是返回指针的
	head->next=NULL;
	head->length=0;
	p1=head;
	cout<<"创建链表,";
	int* pch=new int[10];
	for (int i=0;i<10;i++)
		pch[i]=i+1;
	int num=10;
	int count=0;
	while(count<num)
	{
		p2=new lnode;
		p2->data=pch[count++];  
		p2->next=NULL;
		p1->next=p2; 
		p1=p2;
		head->length++;
	}
	return head;
}

void out_list(lnode *l)//输出元素
{ 
	lnode *p;
	if(l==NULL)
		cout<<"链表为空,请先创建链表!";
	else 
	{
		p=l->next;
		cout<<"链表中有"<<l->length<<"个元素,依次是:"<<endl;
		while(p!=NULL)
		{
			cout<<p->data<<"  ";
			p=p->next;
		}
	}
}
lnode *insert_list(lnode *l)//插入元素
{
	lnode *p,*p1;
	elemtype e;
	int n=0,m=0,j=0;
	if(l==NULL)
		cout<<"链表为空,请先创建链表!";//请先创建链表!"<<endl;
	cout<<"\n在第n个位置后插入,请输入要插入的位置"<<",n在区间【1,"<<l->length<<"】"<<endl;
	n=judge_input(0,l->length);
	p=l->next;
	while(j<n-1)
	{
		p=p->next;
		j++;
	}
	p1=new lnode;
	cout<<"请输入要插入的元素:"<<endl;
	cin>>e;
	p1->data=e; 
	p1->next=p->next;
	p->next=p1;
	l->length++;
	return l;	
}
void delete_list(lnode *l)//删除第i个元素
{ 
	lnode *p;
	int j=0;
	int i;
	if(l==NULL||l->length==0)
	cout<<"链表为空,请先创建链表!";
	else{
		cout<<"删除第i个元素,请输入i的值:n在区间【1,"<<l->length<<"】"<<endl;
		i=judge_input(1,l->length);
		p=l;
		while(j<i-1)
		{
			p=p->next;
			j++;
		}
		p->next=p->next->next;
		l->length--;
	}
}
void locate_list(lnode *l)//查找元素
{
	lnode *p;
	int j=1;
	int e;
	if(l==NULL)
		cout<<"链表为空,请先创建链表!";
	else
	{
		p=l->next;
		cout<<"请输入要查元素的值"<<endl;
		cin>>e;
		while(p!=NULL&&p->data!=e)
		{
			p=p->next;
			j++;
		}
		if(p==NULL)
			cout<<"链表中没有这个元素"<<endl;
		if(p)
			cout<<e<<"在链表的第"<<j<<"个位置"<<endl;
	}

}
int judge_input(int min,int max)//(含min与max)
{
	int n;
	while(true)
	{
		cin>>n;
		if(cin.fail())
		{
			cout<<"请输入数字!\n";
			cin.clear();
			cin.ignore(100,'\n');
			continue;
		}
		if(n<min||n>max)
		{
			cout<<"请重新输入合法的数字!"<<endl;
			cin.ignore();
			continue;
		}
		break;
	}
	return n;

}

LinkList.cpp

// LinkList.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "LinkNode.h"
#include<iostream>
using namespace std;


void main()
{
	int n;
	lnode *l;
	int i;
	elemtype e;
	l=NULL;
	cout<<"1   创建新的线性链表"<<endl;
	cout<<"2   进行插入操作"<<endl;
	cout<<"3   进行删除操作"<<endl;
	cout<<"4   对线性链表中的元素进行排序"<<endl;
	cout<<"5   查找一个元素"<<endl;
	cout<<"6   输出线性链表全部元素"<<endl;
	cout<<"0   结束程序运行"<<endl;

	do{ 
		cout<<endl;
		cout<<"========================================================"<<endl;
		cout<<"请选择要进行的操作:(1创建,2插入,3删除,5查找,6输出,7退出)"<<endl;
		n=judge_input(1,7);
		switch(n)
		{
		case(1): 
				{
					l=create_list();
					if(l!=NULL)
						out_list(l);
				}
				break;
		case(2): 
				{
					insert_list(l);
					if(l!=NULL)
						out_list(l);
				}
				break;
		case(3):
				{
					delete_list(l);
					if(l!=NULL)
						out_list(l);
				}
				break;
		case(4): 
				{
					//order_list(l);
					cout<<"从大到小排序后:"<<endl;
					out_list(l);
				}
				break;
		case(5): 
			{
				locate_list(l);
			}
			break;
		case(6):
			{
				out_list(l);
			}
			break;
		case(7): 
			{
				cout<<"退出"<<endl;
				exit(0);
			}
			break;
		default: 
			{
				cout<<"请选择正确的操作!";
			}
			break;
		}
	}while(n);

}
在编写调试这个程序的时候,链表建立及相关函数的编写本身没有什么问题,但是在考虑到输入数值的合法性、边界性条件及鲁棒性时候,由于对cin的相关函数j及break和continue的不熟悉,所以在这方面花费了不少功夫,有待总结。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值