vs c语言 线性链表,线性链表的实现(c语言)

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

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

⑵ 销毁单链表

⑶ 线性表置空

⑷ 求线性表长度

⑸ 在第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;

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表是一种常见的数据结构,它由一个个结点构成,每个结点包含数据和指向下一个结点的指针。在C语言中,可以使用结构体来定义链表的结点,如引用所示。 链表是一种动态数据结构,它的长度可以根据需要进行动态调整。相比于数组,链表的插入和删除操作更加高效,但查找某个结点的效率较低。 在C语言中,对于链表的操作可以通过指针来实现。例如,可以通过遍历链表来计算链表的表长,即链表中结点的个数。引用中给出了计算链表表长的示例代码,该代码使用了一个指针p来遍历链表,每次遍历时将p指向下一个结点,同时使用一个计数器n来记录结点个数。 另外,对于线性链表中查找某个值为x的结点在链表中的位序,可以使用引用中给出的示例代码。该代码使用一个指针p来遍历链表,同时使用一个计数器i来记录结点的位序。当找到值为x的结点时,返回其位序;如果遍历完整个链表仍然没有找到,则返回-1。 总之,C语言中的线性链表是一种非常灵活的数据结构,它可以通过指针来实现插入、删除和查找等操作,并且可以根据需要动态调整长度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C语言线性表(二):线性链表(单链表)](https://blog.csdn.net/weixin_60921752/article/details/122152569)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值