600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 算法与数据结构之单链表

算法与数据结构之单链表

时间:2022-04-19 03:13:43

相关推荐

算法与数据结构之单链表

单链表:

#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个数:\n");

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个数:\n");

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("\n");

}

void listempty(linklist *L) //判断是否为空

{

if(L->next!=NULL)

printf("链表不为空\n");

else

printf("链表为空\n");

}

void listlength(linklist *L) //求链表的长度

{

int n=0;

linklist *p=L;

while(p->next!=NULL)

{

n++;

p=p->next;

}

printf("长度为%d\n",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\n");

else

printf("取值成功 第%d位的元素为 %d\n",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\n");

else

printf("元素%d在第%d位\n",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("输入错误!\n");

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("输入错误!\n");

else

{

q=s->next;

if(q!=NULL)

{

e=q->data;

s->next=q->next;

free(q);

printf("成功删除元素%d\n",e);

}

else

printf("输入错误!\n");

}

}

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("链表已销毁\n");

exit(0);

}

}

void main()

{ linklist *p;

int m,n;

printf("建表方法:1头插法建表, 2尾插法建表\n");

printf("请输入建表方法:");

scanf("%d",&n);

if(n==1)

creatlistf(p); //调用头插法建表函数

else if(n==2)

creatlistr(p); //调用尾插法建表函数

else

{

printf("error\n");

exit(0);

}

printf("链表已建立完毕\n");

while(1)

{

printf("请选择:");

printf(" 1.输出链表\n");

printf(" 2.判断线性表(单链表)是否为空\n");

printf(" 3.求线性表(单链表)的长度\n");

printf(" 4.从线性表(单链表)中取值\n");

printf(" 5.在线性表(单链表)中查找元素\n");

printf(" 6.插入元素\n");

printf(" 7.删除元素\n");

printf(" 8.销毁链表\n");

printf(" 9.退出\n");

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("输入错误,请重新输入\n");

}

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。