求单链表讲解
求单链表讲解今天在论坛上搜到一段程序
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define N 100
#define OK 1
#define Error 0
int yes=0;
typedef char elemtype;
typedef struct lnode
{
char data;
struct lnode *next;
}lnode,*linklist;
void createlist(linklist *l)
{
int i,n;
linklist p;
char ch;
printf("请输入单链表的长度:\n");
scanf("%d",&n);
*l=(linklist)malloc(sizeof(lnode));
(*l)->next=NULL;
printf("请输入单链表中元素:\n");
for(i=n;i>0;i--)
{
p=(linklist)malloc(sizeof(lnode));
scanf("%c",&ch);
if((ch=getchar())!='\n')
{
p->data=ch;
p->next=(*l)->next;
(*l)->next=p;
}
}
yes=1;
}
int length(linklist *l)
{
int i=0;
linklist p;
p=(*l)->next;
while(p!=NULL)
{
i++;
p=p->next;
}
return i;
}
display(linklist *l)
{
linklist q;
int i;
printf("此时单链表元素:\n");
for(i=1;i<=length(l);i++)
{
printf("%3d",i);
}
printf("\n");
q=(*l)->next;
while(q)
{
printf("%3c",q->data);
q=q->next;
}
printf("\n");
}
listdelete(linklist l,int i,char*e)
{
linklist p=l,q;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return -1;
q=p->next;
*e=q->data;
free(q);
return *e;
}
int listinsert(linklist l,int i,char e)
{
linklist p=l,s;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return -1;
s=(linklist)malloc(sizeof(lnode));
s->data=e;
s->next=p->next;
p->next=p->next;
p->next=s;
return OK;
}
destroylist(linklist l)
{
linklist p=l,q=l->next;
while(q)
{
free(p);
p=q;
q=q->next;
}
free(q);
yes;
}
listempty(linklist l)
{
return (l->next==NULL);
}
void menu()
{
printf(" 单链表基本操作实验 \n");
printf("******************************************************\n");
printf("请选择命令序号(0-7): *\n");
printf("*1创建链表; *\n");
printf("*2链表插入; *\n");
printf("*3链表删除; *\n");
printf("*4求链表长度; *\n");
printf("*5判断链表是否为空; *\n");
printf("*6链表输出; *\n");
printf("*7单链表销毁; *\n");
printf("*0程序结束. *\n");
printf("******************************************************\n");
}
void function()
{
linklist l;
int i,sel;
char ch,e;
while(l)
{
menu();
printf("请输入命令号(0-7):\n");
scanf("%d",&sel);
switch(sel)
{
case 1:
{
createlist(&l);
printf("单链表创建成功!\n");
break;
}
case 2:if(yes==0)
{
printf("此时表未创建!不能插入元素!\n");
break;
}
else
{
printf("请输入要插入的位置:\n");
scanf("%d",&i);
printf("请输入要插入的值:\n");
scanf("%c",&e);
if((e=getchar())!='\n')
listinsert(l,i,e);
break;
}
case 3:if(yes==0)
{
printf("此时表未创建!不能删除元素!\n");
break;
}
else
{
printf("请输入要删除位置:\n");
scanf("%d",&i);
listdelete(l,i,&ch);
break;
}
case 4:if(yes==0)
{
printf("此时表未创建!不能求单链表长度!\n");
break;
}
else
{
printf("单链表的长度是%d\n",length(&l));
break;
}
case 5:if(yes==0)
{
printf("此时表未创建!\n");
break;
}
else if(listempty(l))
printf("当前的单链表是空表!\n");
else
printf("当前单链表为非空表!\n");
break;
case 6:if(yes==0)
{
printf("此时表未创建!不能输出线性表!\n");
break;
}
else
{
display(&l);
break;
}
case 7:if(yes==0)
{
printf("此时表未创建!不能销毁单链表!\n");
break;
}
else
{
destroylist(l);
printf("单链表已被销毁!\n");
break;
}
case 0:exit(1);break;
default:
printf("输入命令错误!请重新输入:\n");
break;
}
}
}
int main(void)
{
function();
return OK;
}
说实话,似乎没太看懂
who能把他改成用指针的插入删除呢。。。。。。。。最好附上解释,不然这一次过关了下次还是不会