编程实现单链表的以下基本操作:建立单链表,查找单链表,插入单链表,删除单链表。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW
using namespace std;
typedef int ElemType;
typedef int Status;
//创建结构体,LNode是类型名,LinkList是LNode的指针类型的类型名
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void CreatList_L(LinkList &L,int n)
{//申请一块类型为LNode的空间,地址赋值给L,初始作为头结点(没有存储数据,负责指向第一个节点 )
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
LinkList p;
for(int i=n;i>0;i--)
{
p=(LinkList)malloc(sizeof(LNode));
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
LinkList p;
p=L;
int j;
j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return ERROR;
LinkList s;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
LinkList p,q;
p=L;
int j;
j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!(p->next)||j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}
Status List_Alter(LinkList &L,int i,int j,ElemType &e)
{
//把第i个元素的值改为j,并用e保存原来第i个元素的值
LinkList p;
p=L;
int ele=0;
while(p&&ele<i)
{
p=p->next;
ele++;
}
if(!p||ele>i)
return ERROR;
e=p->data;
p->data=j;
return OK;
}
Status List_Search(LinkList &L,int i,ElemType &e)
{//查找第i个元素,并用e返回其值
LinkList p;
p=L;
int j=0;
while(p)
{
p=p->next;
j++;
if(j==i)
break;
}
if(!p)
return ERROR;
e=p->data;
return OK;
}
void getLinkList(LinkList &L)
{
LinkList p;
p=L->next;
cout<<"当前链表:"<<endl;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int main()
{
LinkList L;
int n,e;
cout<<"请输入链表长度:"<<endl;
cin>>n;
cout<<"请逆序输入n个元素的值:"<<endl;
CreatList_L(L,n);
getLinkList(L);
cout<<"请输入查找元素的位置:"<<endl;
int i;
cin>>i;
if(List_Search(L,i,e))
{
cout<<"该元素的值为:"<<e<<endl;
}
else
{
cout<<"查找失败!"<<endl;
}
cout<<"请输入想插入元素的位置:"<<endl;
int j;
cin>>j;
cout<<"插入元素的值为:"<<endl;
int p;
cin>>p;
if(ListInsert_L(L,j,p))
{
cout<<"插入成功!"<<endl;
getLinkList(L);
}
else
{
cout<<"插入失败!"<<endl;
getLinkList(L);
}
cout<<"请输入想要删除元素的位置:"<<endl;
int q;
cin>>q;
if(ListDelete_L(L,q,e))
{
cout<<"删除成功!"<<endl;
cout<<"删除元素的值为:"<<e<<endl;
getLinkList(L);
}
else
{
cout<<"删除失败!"<<endl;
getLinkList(L);
}
cout<<"请输入想要修改元素的位置:"<<endl;
int k;
cin>>k;
cout<<"请输入想要修改元素的值:"<<endl;
int l;
cin>>l;
if(List_Alter(L,k,l,e))
{
cout<<"修改成功!"<<endl;
cout<<"原来元素的值为:"<<e<<endl;
getLinkList(L);
}
else
{
cout<<"修改失败!"<<endl;
getLinkList(L);
}
return 0;
}