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的不熟悉,所以在这方面花费了不少功夫,有待总结。