#include <iostream>
#include <stdlib.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
//初始化一个空的单链表
bool InitList(LinkList &L){
L=NULL;
return true;
}
void test(){
LinkList L; //头结点
InitList(L); //使其成为空表
}
//指定结点的后插操作(在p结点后插入数据元素e)
bool InsertNextNode(LNode *p,int e){ //p是一个已经指向结构体LNode的指针
if(p==NULL)
return false;
LNode *s=(LNode *)malloc(sizeof(LNode)); //新建一个指向LNode的指针
if(s==NULL)
return false;
s->data=e; //给新建的指针赋值、插入到p后面
s->next=p->next;
p->next=s;
return true;
}
//按位查找,返回第i个元素(有头结点)
LNode * GetElem(LinkList L,int i){
if(i<1)
return NULL;
LNode *p;
int j=0;
p=L;
while(p!=NULL&&j<i){ //找到第i个元素
p=p->next;
j++;
}
return p;
}
//按位查找2号(有头结点)
LNode *GetElem2(LinkList L,int i){
int j=1;
LNode *p=L->next;
if(i==0)
return L;
if(i<1)
return NULL;
while(p!=NULL&&j<i){
p=p->next;
j++;
}
return p;
}
//按位序插入,即在位序为i的位置插入数据元素e(带头结点)
bool ListInsert(LinkList &L,int i,int e){ //在位序为i的位置插入值为e的数据
LNode *p=GetElem(L,i-1); //用了定义的“找到第i-1个结点的函数”
return(InsertNextNode(p,e)); //用了前面定义的在p结点后插入e的函数
}
//按位序插入(不带头结点)
bool ListInsert2(LinkList &L,int i,int e){
if(i<1)
return false;
if(i==1){
LNode *s=(LNode *)malloc(sizeof(LNode)); //新建一个结点作为“头结点 ”
s->data=e; //赋插入的值
s->next=L; //s指向“旧的头指针”
L=s; //s成为新的头指针
}
LNode *p;
int j=0;
if(p==NULL)
return false;
while(p!=NULL&&j<i-1){
p->next;
j++;
}
return(InsertNextNode(p,e));
}
//指定结点的前插操作(在p结点前插入元素e)
bool InserPriorNode(LNode *p,int e){
if(p==NULL) //就不能在NULL前面插入吗?
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL) //以免内存分配失败
return false;
s->next=p->next; //偷天换日系列,新建的s指针作为“旧的p指针”,而p变成s指针前一个,具有元素e;
p->next=s;
s->data=p->data;
p->data=e;
return true;
}
//前插操作2
bool InserPriorNode2(LNode *p,LNode *s){
if(p==NULL||s==NULL)
return false;
int temp=p->data;
s->next=p->next;
p->next=s;
p->data=s->data; //s带有插入的数据元素e
s->data=temp;
return true;
}
//按位序删除,即删除表中位序为i的元素,并返回e作为被删除的元素值(带头结点)
bool ListDelete(LinkList L,int i,int &e){ //注意e的值是需要返回的,所以这里要&
if(i<1)
return false;
LNode *p;
int j=0;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL||p->next==NULL) //排除第i-1个结点是空或之后无结点的情况
return false;
LNode *q=p->next;
e=q->data; //返回被删除的元素的值
p->next=q->next;
free(q); //释放工具人q的存储空间
return true;
}
//删除指定结点p
bool DeleteNode(LNode *p){
if(p==NULL)
return false;
LNode *q=p->next;
p->data=p->next->data;
p->next=q->next;
free(q);
free(q);
return true;
}
//按值查找,找到数据元素值==e的结点
LNode *LocateElem(LinkList L,int e){
LNode *p=L->next; //从第一个结点开始查找
while(p!=NULL&&p->data!=e)
p=p->next;
return p;
}
//求表的长度
int length(LinkList L){
int len=0;
LNode *p=L;
while(p->next!=NULL){ //头结点不计入表长
p=p->next;
len++;
}
return len; L 0 1 NULL
}
int main(int argc, char** argv) {
cout <<"***Everthing is Fine at present***\n";
return 0;
}
【注】LinkList 和LNode *作用一样,前者强调是单链表,后者强调是指针