c语言线性链表检验是否为空,线性链表的实现(c语言)

这篇博客详细介绍了如何使用C语言实现线性链表的各种操作,包括初始化、清空、置空、求长度、查找、插入、删除、显示元素及计算最大值和平均值。代码涵盖链表的基本操作,并提供了用户交互界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构作业:设某线性表数据元素类型为整型,以链表结构存储线性表。试编程实现:

⑴ 输入数据元素,以先进先出形式创建单链表

⑵ 销毁单链表

⑶ 线性表置空

⑷ 求线性表长度

⑸ 在第i个数据元素前插入新的元素

⑹ 删除第i个元素

⑺ 显示线性表中的全部元素

⑻ 求最大元素的值和平均值

#include

#include

/* 定义ElemType为int类型 */

typedef int ElemType;

#define OK 1

#define ERROR 0

#define flag -0

/* 单链表的结点类型 */

typedef struct LNode

{

ElemType data;

struct LNode *next;

}   LNode,*LinkList;

/* 初始化单链表 */

LinkList InitLinkList()

{

LinkList L;

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

return L;

}

/* 清空单链表 */

void ClearLinkList(LinkList L)

{

L->next=NULL;

printf("链表已经清空/n");

}

void DestoryList(LNode *head)

{

LNode *p,*q;

p=head;

q=head->next;

while(p)

{

free(p);

p=q;

/* 使用指针前判断其非空 */

if (q)

q=q->next;

}

printf("链表销毁成功!/n");

}

/* 检查单链表是否为空 */

int LinkListEmpty(LinkList L)

{

if(L->next==NULL) return OK;

else return ERROR;

}

/* 遍历单链表 */

void LinkListTraverse(LinkList L)

{

LinkList p;

p=L->next;

if(p==NULL) printf("单链表为空表/n");

else

{

printf("链表中的元素为:/n");

while(p!=NULL)

{

printf("%d ",p->data);

p=p->next;

}

}

printf("/n");

}

/* 求单链表长度 */

int LinkListLength(LinkList L)

{

LinkList p;

int j;

p=L->next;

j=0;

while(p!=NULL)

{

j++;

p=p->next;

}

return j;

}

/* 从链表中查找元素 */

LinkList GetLinkList(LinkList L,int i)

{

LinkList p;

int j;

p=L->next;

j=1;

while(p!=NULL&&j

{

p=p->next; j++;

}

if (j==i)

return p;

else return NULL;

}

/* 从链表中查找与给定元素值相同的元素在顺序表中的位置 */

int LocateLinkList(LinkList L,ElemType x)

{

LinkList p;

int j;

p=L->next; j=1;

while ( p!=NULL && p->data != x)

{

p=p->next;

j++;

}

if(p)

return j;

else

return 0;

}

/* 向链表中插入元素 */

void LinkListInsert(LinkList L, int i, ElemType e)

{

LinkList p,s;

int j;

j=1;

p=L;

while(p&&j

{

p=p->next;

j++;

}

if(p==NULL||j>i)

printf("插入位置不正确/n");

else {s=(LNode *)malloc(sizeof(LNode));

s->data=e;

s->next=p->next;

p->next=s;

printf("%d已插入到链表中/n",e);

}

}

/* 从链表中删除元素 */

void LinkListDelete(LinkList L,int i)

{

LinkList p,q;

int j;

j=1;

p=L;

while(p->next&&j

{

p=p->next;

j++;

}

if(p->next==NULL)

printf("删除位置不正确/n");

else

{

q=p->next;

p->next=q->next;

free(q);

printf("第%d个元素已从链表中删除/n",i);

}

}

/*建立单链表*/

LinkList CreatLinkList( )

{

LinkList L=InitLinkList(),p,r;

ElemType e;

r=L;

printf("请依次输入链表中的元素,输入-0结束/n");

scanf("%d",&e);

while (e!=flag)

{

p=(LinkList)malloc(sizeof(LNode));

p->data=e;

r->next=p;

r=p;

scanf("%d",&e);

}

r->next=NULL;

return L;

}

void LinkListM(LinkList L)

{

double aver=0;

int MAX=0;

LinkList p;

p=L->next;

if(p==NULL) printf("单链表为空表/n");

else

{

while(p!=NULL)

{

aver+=p->data;

if(MAXdata)

MAX=p->data;

p=p->next;

}

printf("链表中最大元素是: %d/n",MAX);

aver=aver/LinkListLength(L);

printf("链表中元素平均值是: %f/n",aver);

}

printf("/n");

}

int scan()

{

int d;

printf("/t*********操作菜单***********/n");

printf("1.初始化 2.清空 3.求链表长度 4.检查链表是否为空/n");

printf("5.输出链表中元素 6.从链表中查找元素/n");

printf("7.从链表中查找与给定元素值相同的元素在顺序表中的位置/n");

printf("8.向链表中插入元素 9. 从链表中删除元素/n");

printf("10.建立带头结点的单链表/n");

printf("11.求链表中最大元素和平均值/n");

printf("12.销毁链表/n");

printf("其他键退出。。。。。/n");

scanf("%d",&d);

return(d);

}

void main() { int quit=0;int i,locate; ElemType e; LinkList L,p; while(!quit)    switch(scan()) {          case 1:     L=InitLinkList();     printf("/n");     break;     case 2:     ClearLinkList(L);     printf("/n");     break;     case 3:     printf("链表的长度为 %d/n/n",LinkListLength(L));     break;     case 4:     if(LinkListEmpty(L))printf("链表为空/n/n");     else       printf("链表非空/n/n");     break;     case 5:     LinkListTraverse(L);      break;     case 6:     printf("请输入待查询元素在链表中的位置:");      scanf("%d",&i);      p=GetLinkList(L,i);      if(p)       printf("链表中第%d个元素的值为:%d/n/n",i,p->data);      else       printf("查询位置不正确/n/n");      break;     case 7:     printf("请输入待查询元素的值:");      scanf("%d",&e);      locate=LocateLinkList(L,e);      if(locate)       printf("%d在链表中的位置是:%d/n/n",e,locate);      else       printf("链表中没有值为%d的元素/n/n",e);      break;     case 8:     printf("请输入插入元素的位置和值(中间以空格或回车分隔):/n");      scanf("%d%d",&i,&e);      LinkListInsert(L,i,e);      break;     case 9:     if(LinkListLength(L)==0)       printf("链表已经为空,不能删除/n/n");      else      {      printf("请输入待删除元素的位置:/n/n");       scanf("%d",&i);       LinkListDelete(L,i);     }      break;     case 10:     L=CreatLinkList();      printf("/n");     break;     case 11:     LinkListM(L);     break;    case 12:     DestoryList(L);     break;    default:     quit=1;}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值