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;
}

posted @   平凡的柳先生  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示