牛骨文教育服务平台(让学习变的简单)

单链表:

#include<stdio.h>  
#include<malloc.h>  
#include<windows.h>  
typedef int elemtype;  
typedef struct LNode //定义单链表存储类型  
{  
elemtype data;  
struct LNode *next;  
}linklist;  
void creatlistf(linklist *&L ) //建立链表(头插法)  
{  
linklist *s;  
int i;  
elemtype a[10];  
printf("请输入10个数:
");  
for(i=0;i<10;i++)  
scanf("%d",&a[i]);  
L=(linklist *)malloc(sizeof(linklist));  
L->next=NULL;  
for(i=0;i<10;i++)  
{  
s=(linklist *)malloc(sizeof(linklist));  
s->data=a[i];  
s->next=L->next;  
L->next=s;  
}  
}  
void creatlistr(linklist *&L) //建立链表(尾插法)  
{  
linklist *s,*r;  
int i;  
elemtype a[10];  
printf("请输入10个数:
");  
for(i=0;i<10;i++)  
scanf("%d",&a[i]);  
L=(linklist *)malloc(sizeof(linklist));  
r=L;  
for(i=0;i<10;i++)  
{  
s=(linklist *)malloc(sizeof(linklist));  
s->data=a[i];  
r->next=s;  
r=s;  
}  
r->next=NULL;  
}  
  
void displist(linklist *L) //输出单链表  
{  
linklist *s;  
s=L->next;  
while(s!=NULL)  
{   
printf(" %d",s->data);  
s=s->next;  
}  
printf("
");  
}  
void listempty(linklist *L) //判断是否为空  
{  
if(L->next!=NULL)  
printf("链表不为空
");  
else   
printf("链表为空
");  
}  
void listlength(linklist *L) //求链表的长度  
{  
int n=0;  
linklist *p=L;  
while(p->next!=NULL)  
{  
n++;  
p=p->next;  
}  
printf("长度为%d
",n);  
}  
void getelem(linklist *L) //取值  
{  
int m,i=0;  
linklist *p=L;  
printf("请输入取出元素位置 ");  
scanf("%d",&m);  
while(i<m&&p!=NULL)  
{  
i++;  
p=p->next;  
}  
if(p==NULL)  
printf("error
");  
else  
printf("取值成功 第%d位的元素为 %d
",m,p->data);  
}  
void locateelem(linklist *L) //按值查找  
{  
int m,i=0;  
linklist *p=L;  
printf("请输入需查找元素值 ");  
scanf("%d",&m);  
while(p!=NULL&&p->data!=m)  
{  
i++;  
p=p->next;  
}  
if(p==NULL)  
printf("error
");  
else   
printf("元素%d在第%d位
",m,i);  
}  
void listinsert(linklist *L) //插入元素  
{  
int i=0,j,m;  
linklist *s,*p;  
printf("请输入插入位置:");  
scanf("%d",&j);  
printf("请输入需插入元素:");  
scanf("%d",&m);  
s=L;  
while(i<j-1 && s!=NULL)  
{  
  
s=s->next;  
i++;  
}  
if(s==NULL)  
printf("输入错误!
");  
else  
{  
p=(linklist *)malloc(sizeof(linklist));  
p->data=m;  
p->next=s->next;  
s->next=p;  
}  
}  
  
void listdelete(linklist *&L) //删除元素  
{  
int i,j=0,e;  
printf("请输入需删除第几个元素:");  
scanf("%d",&i);  
linklist *s,*q;  
s=L;  
while(j<i-1&&s!=NULL)  
{  
j++;  
s=s->next;  
}  
if(s==NULL)  
printf("输入错误!
");   
else  
{  
q=s->next;  
if(q!=NULL)  
{  
e=q->data;  
s->next=q->next;  
free(q);  
printf("成功删除元素%d
",e);  
}  
else  
printf("输入错误!
");  
}  
}  
void destroylist(linklist *&L) //销毁链表  
{  
char t;  
getchar();  
printf("确定要销毁链表请输入y否则不销毁: ");   
scanf("%c",&t);  
if(t=="y")  
{  
linklist *p=L,*q;  
q=p->next;  
while(q!=NULL)  
{  
free(p);  
p=q;  
q=p->next;  
}  
free(p);  
printf("链表已销毁
");  
exit(0);  
}  
}  

  

void main()  
{ printf(" ***************欢迎使用单链表基本运算系统********************
");  
printf(" ****************如有问题请与本人联系**************************
");  
linklist *p;  
int m,n;  
printf("建表方法:1头插法建表, 2尾插法建表
");  
printf("请输入建表方法:");  
scanf("%d",&n);  
if(n==1)  
creatlistf(p); //调用头插法建表函数  
else if(n==2)  
creatlistr(p); //调用尾插法建表函数  
else   
{  
printf("error
");  
exit(0);  
}  
printf("链表已建立完毕
");  
while(1)  
{  
printf("请选择:");  
printf(" 1.输出链表
");  
printf(" 2.判断线性表(单链表)是否为空
");  
printf(" 3.求线性表(单链表)的长度
");  
printf(" 4.从线性表(单链表)中取值
");  
printf(" 5.在线性表(单链表)中查找元素
");  
printf(" 6.插入元素
");  
printf(" 7.删除元素
");  
printf(" 8.销毁链表
");  
printf(" 9.退出
");  
scanf("%d",&m);  
switch(m)  
{ case 1:displist(p);break;  
case 2:listempty(p);break;  
case 3:listlength(p);break;  
case 4:getelem(p);break;  
case 5:locateelem(p);break;  
case 6:listinsert(p);break;  
case 7:listdelete(p);break;  
case 8:destroylist(p);break;  
case 9:exit(0);  
default:printf("输入错误,请重新输入
");  
}  
  
}  
}