AUSTOj4
LinkList可以定义指向List的指针
1.当函数参数为LinkList L时,意味着只改变或操作List的内容,而不需要改变L这个指针
如
Status GetElem(LinkList L,int i,ElemType)
2.当参数为LinkList &L时,意味着需要改变或操作L这个指针本身
如
Status InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(struct LNode));
......
}
这里想初始化单链表,需要给L分配内存空间,即需要改变L
3.当参数为LinkList *L时,意味着需要改变或操作L这个指针指向的LinkList类型的指针
(此处的L可以理解为指向前两点中的L的指针)
此时给头结点分配储存空间时要这样写
(*L)=(LinkList)malloc(sizeof(struct LNode));
L前面要加*,表示L所指向的那个指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int ElemType;
typedef int Status;
#define ERROR 0
#define OK 1
typedef struct LNode{ //定义一个链表
ElemType data; //链表的数据
struct LNode *next; //定义数据的后续空间
}LNode, *linkList;
Status GetElem_L(linkList &L, int i, ElemType &e) { //获取位置i处的元素,并用e接住这个值
linkList p;
int j=1;
p=L->next;
while(p&&j<i){
p=p->next;++j;
}
if(!p||j<i)
return ERROR;
e=p->data;
return OK;
}
Status ListInsert_L(linkList &L, int i, ElemType e) { //在位置i处插入一个元素,并用e接住
LNode *p,*s;
int j=0;
p=L;
while(p&&j<i-1) //可以理解为:while(p!=null && p != 0 && p!=false &&j<i-1) 即p的范围是合理的
{
p=p->next; //p指向他的下一个
++j;
}
if(!p||j>i-1)
return ERROR;
s=(linkList)malloc(sizeof(LNode));//malloc函数用于在内存开辟了一段地址,而这段地址的首地址存在返回的那个指针变量里
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete_L(linkList &L, int i, ElemType &e) { //删除i处的元素,并用e接住
LNode *p,*q;
p=L;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}
void CreateList_L(linkList &L, int n) { //创造一个新的链表
int i;
linkList p;
L=(linkList)malloc(sizeof(LNode));
L->next=NULL;
for(i=n;i>0;--i)
{
p=(linkList)malloc(sizeof(LNode));
scanf("%d",&(p->data));
p->next=L->next ;
L->next =p;
}
}
int ShowList_L(linkList L){
// 显示链表中的元素,返回值为链表元素的数目
///===============补充代码========================
linkList p;
p=L->next; //定义头指针
int i=0;
while(p!=NULL){ //确认非空
printf("%d ",p->data);
p=p->next;
i++;
}
return i;
}
int main(){
int n; // 初始时元素的数目
int m; // 指令的数目
char strInst[30]; // 存储指令:instruction
int a; // 存储位置数据
linkList L; // 链表
int e; // 定义节点,用来存储获取的节点或者删除的节点
scanf("%d", &n); // 读入元素的数目
CreateList_L(L, n); // 创建链表
scanf("%d", &m); // 读取指令的数目
while(m--){ // 做 m 次循环
scanf("%s", strInst); // 读取指令
if(strcmp(strInst, "get") == 0){ // 如果是需要获取某个元素
scanf("%d", &a); // 读取元素的位置
if(GetElem_L(L, a, e) == OK){ // 如果获取元素成功
printf("%d\n", e); // 输出元素的值
}else{ // 如果获取元素失败
puts("get fail"); // 输出获取元素的出错信息
}
}else if(strcmp(strInst, "insert") == 0){// 如果是插入某个元素
scanf("%d%d", &a, &e); // 获取待插入的位置以及待插入的值
if(ListInsert_L(L, a, e) == OK){ // 如果插入元素成功
puts("insert OK"); // 输出插入成功的信息
}else{
puts("insert fail"); // 否则输出插入失败的信息
}
}else if(strcmp(strInst, "delete") == 0){// 如果是删除某个元素
scanf("%d",&a); // 获得待删除元素的位置
if(ListDelete_L(L, a, e) == OK){ // 如果删除成功
puts("delete OK"); // 输出删除成功的信息
}else{
puts("delete fail"); // 否则输出删除失败的信息
}
}else if(strcmp(strInst, "show") == 0){ // 如果是显示链表
if(ShowList_L(L) == 0){ // 如果链表为空
puts("Link list is empty"); //显示量表为空的信息
}
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律