下面是我当时出错的代码 :(一个简单的单链表)
#include<stdlib.h>
#include <stdio.h>
typedef struct LNode{ //定义单链表结点类型
int data; //每个节点存放 一个元素
struct LNode *next; //指针指向下一个节点
}LNode,*LinkList;
//定义一个单链表
bool InitList (LinkList &L){
L=(LNode *)malloc(sizeof(LNode));//分配一个头结点
if(L==NULL){
return false;
}
L->next=NULL; //头结点之后暂时没有结点
return true;
}
// 插入元素-按位序插入(带头结点)
bool ListInsert(LinkList &L,int i,int e){ //在第i个位置插入元素e
if(i<1)//检查i是否合法
{
return false;
}
LNode *p; //指针p指向当前扫描到的结点
int j=0; //p当前指向的是第几个结点
p=L;
while(p!=NULL &&j<i-1){//循环找到第i-1个结点
p=p->next;
j++;
}
//以下代码可使用InsertNextNode函数代替
// if(p==NULL){//i值不合法
// return false;
// }
// LNode *s=(LNode *)malloc(sizeof(LNode));
// s->data=e;
// s->next=p->next;
// p->next=s;
// return true;
return InsertNextNode(p,e);
}
//后插操作:在p结点之后插入元素 e
bool InsertNextNode(LNode *p, int e){
if (p==NULL){
return false;
}
LNode *s =(LNode*) malloc(sizeof(LNode));
if (s==NULL){ //内存分配失败
return false;
}
s->data = e; //用结点s保存数据元素e
s->next=p->next;
p->next=s; //将结点s连到p之后
return true;
}
int main(){
LinkList L;//声明一个指向单链表的指针
// 初始化一个空表
InitList(L);
//插入表头
if(ListInsert( L,1,1)==true) {
printf("表头元素是1\n");
}
//插入表中-在第2个位置插入元素2
if(ListInsert( L,2,2)==true) {
printf("第2个位置插入元素2\n");
}
return 0;
}
出现这个错误的原因是函数调用时,子函数ListInsert调用另一个子函数InsertNextNode,而ListInsert函数的位置在上面无法调用下面的那个子函数,把两个函数位置调换一下即可。