求教单链表问题...纠结一晚上了...
这个程序是我看书之后自己编写的,因为刚刚接触,所以还有很多地方不明白。。。想请各位前辈帮我看一下哪里出错了。。我看了一晚上也没有找出来。。很纠结。。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<conio.h>
#define OK 1
#define ERROR 0
typedef int datatype;
typedef struct
{
datatype data;
struct lnode *next;
}lnode,*linklist;
void createfromhead(linklist L,int n)
{
lnode *p,*q;
int i;
L=(lnode*)malloc(sizeof(lnode));
L->next=NULL;
p=L;
printf("\n\t依次输入元素:");
for(i=1;i<=n;i++)
{
q=(lnode*)malloc(sizeof(lnode));
scanf("%d",&(q->data));
q->next=p->next;
p->next=q;
p=q;
}
}
int insertlist(linklist L,int i,datatype e)
{
lnode *p,*q;
int j;
j=0;
p=L;
while(j<i-1&&p)
{
p=p->next;
j++;
}
if(!p||j>i-1) return ERROR;
q=(lnode*)malloc(sizeof(lnode));
q->data=e;
q->next=p->next;
p->next=q;
return OK;
}
int deletelist(linklist L,int i,datatype *e)
{
lnode *p,*q;
int j=0;
p=L;
while(j<i-1&&p->next)
{
p=p->next;
j++;
}
if(!(p->next)||j>i-1) return ERROR;
q=p->next;
p->next=q->next;
free(q);
return OK;
}
int locate(linklist L,datatype x)
{
lnode *p;
int i=1;
p=L->next;
while(p)
{
if(p->data==x)
return i;
else
{
p=p->next;
i++;
}
}
return OK;
}
int deleteall(linklist L)
{
lnode *p,*q;
p=L;
q=L->next;
while(q)
{
p->next=q->next;
free(q);
q=p->next;
}
return OK;
}
void printlist(linklist L)
{
lnode *p;
p=L->next;
printf("\n\t单链表的元素为: ");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
void operate(linklist L)
{
int i,e,x;
int choose;
while(1)
{
printf("\n\t");
printf("\n\t--------------操作界面--------------");
printf("\n\t1.插入 2.删除 3.查找 4.删除所有 0.退出");
printf("\n\t输入你的选择:");
scanf("%d",&choose);
switch(choose)
{
case 1:
{
printf("\n\t输入要插入元素的位置和数值:");
scanf("%d %d",&i,&e);
if(insertlist(L,i,e))
printlist(L);
else
printf("\n\t输入错误!");
break;
}
case 2:
{
printf("\n\t输入要删除元素的位置:");
scanf("%d",&i);
if(deletelist(L,i,&e))
printlist(L);
else
printf("\n\t输入错误!");
break;
}
case 3:
{
printf("\n\t输入想要查找的元素:");
scanf("%d",&x);
if(locate(L,x))
{
printf("\n\t该元素的位置是:");
printf("\n\t %d",locate(L,x));
break;
}
}
case 4:
{
deleteall(L);
printf("\n\t删除后的链表:");
printlist(L);
}
case 0:
{
exit(OK);
break;
}
default:
printf("\t输入指令错误,请按规则输入\n\n");
break;
}
}
}
int main(int argc, char** argv)
{
int n;
lnode *L;
printf("\n\t输入创建链表元素的个数:");
scanf("%d",&n);
createfromhead(L,n);
printf("\n\t链表创建成功!");
printlist(L);
printf("\n\t任意输入进入操作界面。");
getch();
system("cls");
operate(L);
return OK;
}
单链表
[解决办法]
传二级指针的目的是希望改变一级指针指向的地址,正如传一级指针可以改变该指针指向的内容。
在主函数这样调用createfromhead(&L),声明如下createfromhead(LinkList *L)。具体的你可以在网上搜一下。