原题链接:蓝桥杯算法提高VIP-盾神与砝码称重
解题思路:
注意事项:
参考代码:
#include<stdio.h> #include<malloc.h> #define ElemType int //假定线性表中数据元素为int类型 typedef struct LNode{ ElemType data; //结点的数据域 struct LNode *next; //结点的指针域 }LNode, *LinkList; //访问线性链表 void ListTraverse_L(LinkList L, void (*visit)(ElemType)) { /*声明指针p(用于指 向当前访问数据元素) */ LNode *p; /* 将p定位于L中的首元结点 */ p=L->next; /* 若p指向的结点存在 */ while(p) { /* 调用visit()方法进行访问该结点 */ visit(p->data); /* p指向下一个结点 */ p=p->next; } } //线 性链表的读取 int GetElem_L(LinkList L, int i, ElemType *e) { /* 初始化,p指向第一个结点,j为计数器*/ LinkList p = L->next; int j = 1; /* 顺指针向后查找,直到 p指向第 i个元素或 p 为空 */ while (p && j<i ) { p = p->next; j++; } if( !p || i<1 ) return 0; // 第 i 个元素不存在 *e = p->data; // 取第 i 个元素 return 1; } //线性链表插入算法 int ListInsert_L(LinkList L, int i, ElemType e){ /*在线性链表L中第 i个位 置之前插入新元素e*/ LinkList p,s; int j; if(i<1) return 0; //1.寻找第i-1个结点 p=L; j=0; while(p && j<i-1){ p=p->next; ++j; } if( !p ) return 0; //i大于表长加1 //2.生成新结点 s=(LinkList) malloc(sizeof(LNode)); s->data=e; //3.插入L中 s->next=p->next; p->next=s; return 1; } //线性链表的删除 int ListDelete_L(LinkList L,int i, ElemType *e) { /*在带头结点的单链表L中删 除第i个元素,并由e返回其值 成功删除返回1,否则返回0*/ LinkList p,q; int j=0; /* 1.寻找第i个结点,并令p指向 其前趋 */ p = L; while (p->next && j < i-1) { p = p->next; ++j; } if (!(p->next) || i<1) return 0; /*删除位置非法*/ q = p->next; p->next = q->next; *e = q->data; free(q); return 1; } //建立线性链表 //逆位序输入n个元素的值,建立带头结点的单链线性表L LinkList CreateList_L(int n) { LinkList L,p; //1. 建立一个带头结点的单链表 L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; //2. 逆位序生 成n个新结点 ElemType e; while(n--) { scanf("%d",&e); p=(LNode*)malloc(sizeof(LNode)); p->data=e; p- >next=L->next; L->next=p; } return L; }
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复