整段代码的意思就是实现了链表的新建、节点插入、节点删除和打印等功能
对其进行了详细的注释,如下图:
注释后的代码如下:(其中修改了两处地方,详见注释加粗部分)
#include <malloc.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status
typedef int ElemType
typedef struct LNode { // 链表节点结构体
渣空亏 ElemType data
struct LNode * next
} LNode, *LinkList
// 设置别名,LNode等价于struct LNode, LinkList等价于struct LNode *
Status InitList_L(LinkList&L) { // 初始化L链表,新建了第0个节点
L = (LNode*)malloc(sizeof(LNode))// 分配内存空间
if ( L == NULL)
return ERROR
L->data = NULL
L->next = NULL
return OK
}
Status DestroyList_L(LinkList&L) { // 销毁L链表
LinkList p
while (L) { // 依次遍历链表上的每个节点
p = L
L = L->next
free(p)// 释放之前分配的内存空间
}
return OK
}
// 在链表L的第i个节点前插入新节点,节点值为e
Status ListInsert_L(LinkList &L, int i, ElemType e) {
LinkList p = L// 注意p初始指向链表第0个节点
int j = 0
while (p &&j <i-1) { // p移动到第i-1个节点
p = p->next
j++
如神 }
if (p == NULL || j >i-1) // i为0或超过链表长度,插入失败
return ERROR
else {
LinkList s = (LNode*)malloc(sizeof(LNode))// 新建待插入的节点
s->data = e// s值为e,要插入到第i-1个节点之后成为第i个节点
s->next = p->next// s插入到p和p->next之间
p->next = s// 满足p-->s-->(p->next)
return OK
}
}
// 删除链表L的第i个节点,并令e保存节点值
Status ListDelete_L(LinkList &L, int i, ElemType&e) {
LinkList p = L// 注意亏乱p初始指向链表第0个节点
int j = 0
while (p->next &&j <i-1) { // p移动到第i-1个节点;p不能为最后一个节点
p = p->next
++j
}
if (p->next == NULL || j >i-1) // i为0或超过链表长度,删除失败
return ERROR
else { // 要删除p之后的节点,即p->next
LinkList s = p->next// 先保存待删除的节点
p ->next = s->next// p->next直接指向待删除节点的下个节点
e = s->data// 保存待删除节点值
free(s)// 释放节点空间
return OK
}
}
void ListPrint_L(LinkList L) { // 打印链表
LinkList p = L->next// 注意L为第0个节点,L->next才为第1个节点
printf("LinkList:(")
while (p) { // 依次输出每个节点值
printf("%d,", p->data)
p = p->next
}
printf(")\n")
}
void ListInput(LinkList&L) {
int n
printf("please input number:")
scanf("%d", &n)// 输入链表节点个数
for(int i = 0i <ni++) // 这里原代码多加了一个分号要去掉
{
int v
scanf("%d", &v)// 输入每个节点值
ListInsert_L(L, 1, v)// 每个节点都插入到第1个位置
}
}
int main(int argc, char* argv[]) {
char s[256]
printf("Input your name:")
printf("%s\n", gets(s))
LinkList LInitList_L(L)ListPrint_L(L)// 初始化空链表L,新建第0个节点
ListInput(L)//调用输入函数
//ListInsert_L(L,1,1)
//ListInsert_L(L,2,5)
//ListInsert_L(L,3,8)
//ListInsert_L(L,4,10)
ListPrint_L(L)// 打印新建的链表
int v
ListDelete_L(L, 3, v)// 删除第3个节点,获取其值到v中
ListPrint_L(L)// 打印删除后的链表
DestroyList_L(L)// 最后还应销毁链表,释放内存空间
return 0
}
第一题:p先指向了薯段a[1],然后y逐步累加,也就是y = 1+4+6+8 = 19。第二题:重点考核静态变量(也就是f()中的c变量)。第一次调用灶手州f()后输出2+1+4=7,第二次调用f()后输出2+1+5=8,第三次调用f()后输出2+1+6=9。
第三题:重点考核switch-case语句的构成。由于缺了break语句,所以第一次循环会执行default分支后直接退出;第二次循环则会悲催地执行case 1分支、之后顺序将case 2和default也蹂躏个遍;第三次循环执行case 2分支、之后又在default上踩一脚……隐蔽
百度嫌我字数不够
你刚发的图片,我码了半天的字,结果删了?!我直接复制的。。连你没打出来的第二题一并给你解决了。。第一题: 02
原因:switch(a)进入case1:switch(b)的时候输出0,但是case1运行完了并没有break跳出,那麼继续运行case2,故输出02.
第二题:a=5,销携裤b=2,c=1
原因:大括号里边的变隐余量是局部变量,在上一级变量和局部变量重名时,以局部变量优先级高,故局部变量C的最终结果是2,a+=2,则a为5,而上一级变量的b、c不参与运算,故依旧为2、1。
第三题:6
原因:非0数的真值都是1,那麼除了if(!y)都执行,则z=2+1+3=6
第四题:46
原因:这里有个小陷阱,虽然每个if都要对应一个else,但是第一个亏简if下没有大括号,则第二个if后的;应作为第一个if的结束,故题中唯一一个else应对应的是第一个if。
第五题:t=4
原因:这导题正好是第四题的反面例子,if语句会寻找下一个;作为结束标志,但else不会,故else以後的if-else是正常逻辑运行。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)