#include "stdafx.h"
#include<iostream>
using namespace std;
#include<malloc.h>
#define OK 1 //正确
#define ERROR 0 //失败
typedef int ElementType;
typedef struct LNode{ //定义结构体
ElementType data;
LNode *next;
}LNode,*LinkList;
//初始化单链表
void init(LinkList &L,int n)
{
if(n<0) return ;
L = (LinkList) malloc(sizeof(LNode));
L->next=NULL;//创建头指针
int data;
LinkList node;
for(int i=0;i<n;i++)
{
cin>>data;
node = (LinkList) malloc(sizeof(LNode));//创建LNode的节点
node->data=data;
node->next=L->next;
L->next=node;
}
}
//获取单链表第i个位置的元素e
int getElement(LinkList &L,int i,ElementType &e)
{
LNode *p;
int j=1;
p=L->next;
while(p && j<i)
{
p=p->next;
++j;
}
if(!p || j>i)
{
cout<<"没有找到位置序号"+i;
return ERROR;
}
e=p->data;
cout<<"单链表第"<<i<<"个位置的元素是:"<<e;
return OK;
}
//删除单链表的第i个位置的元素
void insert(LinkList &L,int i,ElementType &e)
{
LNode *p;
int j=1;
LinkList node;
p=L;
while(p && j<i) //寻找第i-1个节点
{
p=p->next;
++j;
}
if(!p || j>i)
{
cout<<"插入的位置已经超出边界"<<endl;
return;
}
node = (LinkList) malloc(sizeof(LNode));//创建LNode的节点
node->data=e;
node->next = p->next;
p->next = node;
}
//向单链表的第i个位置插入元素e
void delLink(LinkList &L,int i,ElementType &e)
{
LNode *p,*q;
int j=1;
LinkList node;
p=L;
while(p->next && j<i) //寻找第i节点,也可以寻找第i-1个节点
{
p=p->next;
++j;
}
if(!(p->next)|| j>i)
{
cout<<"删除的位置不对"<<endl;
return;
}
q=p->next;
p->next=q->next;
e=q->data;
free(q);
}
//打印单链表的数据
void print(LinkList &L)
{
LNode *p;
p=L->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
}
int main(int argc,char* argv[]){
LinkList L;
ElementType e;
int n;
cout<<"请输入需要创建的链表长度: "<<endl;
cin>>n;
cout<<"请输入"<<n<<"个数据: ";
init(L,n);
cout<<"创建的链表为: ";
print(L);
cout<<endl;
cout<<"请输入需要获取链表那个位置的元素: ";
cin>>n;
getElement(L,n,e);
cout<<"请输入要插入元素的位置和数据: ";
cin>>n;
cin>>e;
cout<<"插入后的单链表为:"<<endl;
insert(L,n,e);
print(L);
cout<<"请输入要删除元素的位置: ";
cin>>n;
delLink(L,n,e);
cout<<"删除后的单链表为:"<<endl;
print(L);
print(L);
cin>>n;
return OK;
}