/********************** 声明部分 **********************/
#include
#include
#include
#define LIST_INIT_SIZE 10 //定义最初申请的内存的大小
#define LIST_INCREMENT 2 //每一次申请内存不足的时候扩展的大小
#define OVERFLOW false //异常抛出返回值
#define ERROR false //异常抛出返回值
#define FALSE false //异常抛出返回值
#define TRUE true //程序正确执行抛出返回值
#define INFEASIBLE false //异常抛出返回值
#define OK true //程序正确执行抛出返回值
typedef int ElemType; //别名声明,其实int可以用任意的名字代入
typedef bool Status; //别名声明
/********************** 结构体定义部分 **********************/
struct LNode
{
ElemType data; //数据域
LNode *next; //指针域
};
typedef LNode *LinkList;
/********************** 函数块部分 **********************/
/********************** 构造一个空的线性表 **********************/
void InitList(LinkList &L)
{
//初始条件:无
L=(LinkList)malloc(sizeof(LNode)); //产生头结点,并使L指向此头结点
if(!L) //储存分配失败
exit(OVERFLOW);
L->next=NULL; //指针域为空
}
/***************销毁线性表*****************/
void DestroyList(LinkList &L)
{
LinkList q;
while(L)
{
q=L->next;
free(L);
L=q;
}
}
/**************清空线性表**************/
void ClearList(LinkList &L)
{
LinkList q,p;
p=L->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
}
/*******判断线性表是否空*******/
int ListEmpty(LinkList &L)
{
if(L->next)
return 0;
else
return 1;
}
/************返回线性表的长度************/
int ListLength(LinkList &L)
{
int i=0;
LinkList p=L->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
/********************** 用e返回L中第i个元素的值 **********************/
Status GetElem(LinkList &L,int i,ElemType &e)
{
//初始条件:线性表已经存在,L为带头结点的单链表的头指针
int j=1;
LinkList p=L->next;
while(p&&j {
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
/**************查找元素的位置**************/
int LocateElem(LinkList &L, ElemType e,
int (*compare)(ElemType, ElemType))
{
int i=0;
LinkList p=L->next;
while(p)
{
if(compare(p->data,e))
i++;
p=p->next;
}
if(i<=ListLength(L))
return i;
else
return 0;
}
/********************** 在L中第i个位置之前插入新的数据元素e,L的长度加1 **********************/
Status ListInsert(LinkList &L,int i,ElemType e)//不改变L
{
//初始条件:线性表已经存在,1<=i<=ListLength(L)+1
int j=0;
LinkList p=L,s;
while(p&&j
p=p->next;
j++;
}
if(!p||j>i-1) //i小于1或者大于表长
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); //生成新节点
s->data=e; //插入L中
s->next=p->next;
p->next=s;
return OK;
}
/********************** 删除L的第i个元素,并用e返回其值,L的长度减1 **********************/
Status ListDelete(LinkList &L,int i,ElemType &e)
{
//初始条件:线性表已经存在,1<=i<=ListLength(L)+1
int j=0;
LinkList p=L,q;
while(p->next&&j
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;
}
/***********用pre_e返回cur_e的前驱************/
int PriorElem(LinkList &L,ElemType cur_e,ElemType &pre_e)//
{
LinkList q,p=L->next;
while(p->next)
{
q=p->next;
if(q->data==cur_e)
{
pre_e=p->data;
return OK;
}
p=q;
}
return INFEASIBLE;
}
/************next_e返回cur_e的后继*************/
int NextElem(LinkList &L,ElemType cur_e,ElemType &next_e)
{
LinkList p=L->next;
while(p->next)
{
if(p->data==cur_e)
{
next_e=p->next->data;
return OK;
}
p=p->next;
}
return INFEASIBLE;
}
/********************************以此对L的每个数据元素调用函数vi()*****************************/
void ListTraverse(LinkList L,void (*vi)(ElemType &))
{
LinkList p=L->next;
while(p!=NULL)
{
vi(p->data);
p=p->next;
}
printf("\n");
}
/*********************输出格式(%d)*********************/
void print(ElemType &c)
{
printf("%d ",c);
}
/************比较功能函数***************/
Status equal(ElemType c1,ElemType c2)
{
if(c1==c2)
return TRUE;
else
return FALSE;
}
/**************主函数********************/
void main()
{
int i,j,e,k;
LinkList La;
InitList(La);
printf("输入单链表La中的五个元素:");
for(i=1;i<=5;i++)
{
scanf("%d",&e);
ListInsert(La,i,e);
}
printf("单链表的长度:%d\n",ListLength(La));
i=ListEmpty(La);
printf("La是否空:i=%d (1:是 0:否)\n",i);
ClearList(La);
printf("清空La后:La=");
ListTraverse(La,print);
printf("L是否空:i=%d (1:是 0:否)\n",i=ListEmpty(La));
printf("请再次输入单链表La中的五个元素:");
for(i=1;i<=5;i++)
{
scanf("%d",&e);
ListInsert(La,i,e);
}
printf("输入要查找的第几个元素:");
scanf("%d",&i);
printf("查找的元素为:");
GetElem(La,i,e);
printf("%d\n",e);
printf("La:");
ListTraverse(La,print);
printf("输入要删除元素的位置:");
scanf("%d",&i);
ListDelete(La,i,e);
printf("La:");
ListTraverse(La,print);
printf("删除的元素为:%d\n",e);
while(1)
{
printf("输入一个链表中的元素:");
scanf("%d",&j);
if((k=PriorElem(La,j,e))==INFEASIBLE)
printf("此元素无前驱!\n");
else
break;
}
printf("此元素的前驱为%d\n",e);
while(1)
{
printf("输入一个链表中的元素:");
scanf("%d",&j);
if((k=NextElem(La,j,e))==INFEASIBLE)
printf("此元素无后继!\n");
else
break;
}
printf("此元素的后继为%d\n",e);
DestroyList(La);
printf("销毁La后: La=%u\n",La);
}
这是我编的单链表12种操作,你参考一下,采纳呀
具体逻辑没去看你的。。只把你的语法错误改了。。 有些函数传入的是指针的指针的时候要注意,同时申请内存的时候最好做个判断,以防申请失败了还在运行代码
Status CreateList_L(LinkList* L,int n)
{
int LISTLEN = 0,i,*P; L= (LinkList*)malloc(sizeof(LNode));
(*L)->len = 0;
(*L)->next = NULL;
for( i = n;i>0;--i)
{
LinkList p = (LinkList)malloc(sizeof(LNode));
printf("请输入元素的值(前插):\n"); scanf("%d",&p->data);
p->next = (*L)->next; (*L)->next = p;
(*L)->len++;LISTLEN++;
}
return 1;
}
int ListLength(LinkList L)
{int len1=0;
LinkList p = L->next;
while(p)
{p = p->next;
len1++;
}
return len1;}
Status ListInsert(LinkList *L,int i,ElemType e)
{ if(i<1 || i>ListLength(*L)+1)
{ printf("插入失败! 访问越界\n");
return ERROR;}
else
{int j;
LinkList p = *L;
for(j = 0;j
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s; (*L)->len++;
return TRUE;
}
}
Status ListDelete(LinkList * L,int i,ElemType & e)
{ if(i<1 || i>ListLength(*L))
{ printf("插入失败! 访问越界\n");
return ERROR;}
else
{LinkList p = *L;
int j;
for(j = 0;j < i-1;j++) p = p->next;
e = p->next->data;
LinkList q = p->next;
p->next = q ->next;
(*L)->len--;
free(q); return TRUE;
}
}
你这个定义的结构体,typedef struct LNode{
ElemType data;
int len;
struct LNode *next;
}LNode
LNode 最好不要重名,而且你没有主函数,最好把主函数也带上,这样好改!!!
C++里可否直接用C的链表操作代码?