链表中的笔记

ListLength(L)

#define MAX 100

typedef struct{

                              int *base;

                               int front;

                               int last;

                         }SqList;

  int SqListlength(SqList L)

{ //链表中的元素个数

          return (L.last-L.front+MAX)/MAX;

}

 

 

Status Get(Triplet T,int i,ElemType &e)
{返回链表的第i个值

      T_len=ListLength(T);
    if(i>T_len || i<0) return ERROR;
    e=T[i-1];
    return ok;      
}

 

void union(List &La,List Lb)
{//将所有不在线性表La,但在Lb中的元素,转移到La中
     La_len=ListLength(La);Lb_len=ListLength(Lb);
     for(i=1;i<Lb_len;i++)
                      {
      GetElem(Lb,i,e);//取出Lb中第i个元素赋值给e.
      if(!LocateElem(La,e,equal)) 
                      ListInsert(La,++La_len,e);//不存在的进行插入
                      }
}

 

Ststus ListInsert_Sq(SqList &L,int i,ElemType e)
{//在顺序线性表L中第i个位置之前插入新元素e
    if(i<1 ||i>L.Length+1)
                 return 0;//i不合法
    if(L.length>=L.listsize)
    {//存储空间已经满了,增加分配
         newbase=(Elemtype *)realloc(L.elem,(L.listsize+Listsize)*sizeof(ElemType));
         if(!newbase) exit (-1);//新空间开辟失败
         L.elem=newbase;//新基趾
         L.listsize+=Listsize;  //增加存储容量                     
    }
    q=&(L.elem[i-1]);//q为插入位置
    for(p=&(L.elem[L.length-1]);p>=q;--p)

                     *(p+1)= *p;            //插入位置及之后的元素右移
    *q=e;//插入e
    ++L.length;//表长增加1
    return ok;                 
}

 

Status ListDelete_Sq(SqList &L,int i,ElemType &e)
{//删除第i个元素,并用e来进行返回
      L_len=ListLength;
      if(i<0 || i>L_len) return -1;
      p=&(L.elem[i-1]);//p为被删除元素的位置
      e=*p;//被删除的元素赋值给e
      q=L.elem+L.length-1;//表尾的元素
      for(++p;p<=q;++p)
                *(p-1)=*p;//删除元素后左移
      --L.length;
      return ok;
}


int ListDelete(LinkList &first,int i)
{//将链表第i个元素删除
    ListNode *p,*q;
       p=Locate(first,i-1);//寻找第i-1个结点
       if(p==NULL || p->link==NULL)
             return 0;//i的值不合理
       q=p->link;//q此时指第i个元素
       p->link=q->link;//删除结点
       delete q;//释放
       return 1;
}


Status ListDelete(List &L,int i,ElemType &e)
{//删除第i个元素,并用e来进行返回
      ListNode *p,*q;
      p=Locate(first ,i-1);
      if(p==NULL || p->link==NULL)
              return 0;
        q=p->link;
        e=*q;
        p->link=q->link;
        delete q;
        return 1;      
}

 

 Status LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
{//在链表中第一个与e满足compare()的元素的为序
    i=1;//i的初始位序
    p=L.elem;//p的初值为第一个元素的值
    while(i<=L.length && !(*compare)(*p++,e))
                 i++;
     if(i<=L.length) return i;
     else return 0;  
}

 

Ststus GetElem_L(LinkList L,int i,ElemType &e)
{//L为带头结点的单链表的头指针
    p=L->next;j=1;//p指向第一个结点,j为计数器
    while(p && j<i)//顺着指针找,直到p指向第i个元素或p为空
    {
       p=p->next;j++;       
    }
    if(!p || j>i) return 0;//第i个元素不存在
    e=p->data;//取出第i个元素
    return ok;     
}

使用链表来实现笔记管理,可以实现更加灵活和高效的增删改查操作。下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 笔记结构体 struct Note { char title[50]; // 标题 char content[200]; // 内容 struct Note *next; // 下一个节点指针 }; // 创建新笔记 struct Note *createNote() { struct Note *note = (struct Note*)malloc(sizeof(struct Note)); printf("请输入标题:"); scanf("%s", note->title); printf("请输入内容:"); scanf("%s", note->content); note->next = NULL; return note; } // 添加笔记 void addNote(struct Note **head) { struct Note *newNote = createNote(); if (*head == NULL) { *head = newNote; } else { struct Note *p = *head; while (p->next != NULL) { p = p->next; } p->next = newNote; } printf("笔记添加成功!\n"); } // 编辑笔记 void editNote(struct Note *head) { if (head == NULL) { printf("当前没有笔记!\n"); return; } char title[50]; printf("请输入要编辑的笔记的标题:"); scanf("%s", title); struct Note *p = head; while (p != NULL) { if (strcmp(p->title, title) == 0) { printf("请输入新内容:"); scanf("%s", p->content); printf("笔记编辑成功!\n"); return; } p = p->next; } printf("未找到该笔记!\n"); } // 删除笔记 void deleteNote(struct Note **head) { if (*head == NULL) { printf("当前没有笔记!\n"); return; } char title[50]; printf("请输入要删除的笔记的标题:"); scanf("%s", title); if (strcmp((*head)->title, title) == 0) { struct Note *temp = *head; *head = (*head)->next; free(temp); printf("笔记删除成功!\n"); return; } struct Note *p = *head; while (p->next != NULL) { if (strcmp(p->next->title, title) == 0) { struct Note *temp = p->next; p->next = temp->next; free(temp); printf("笔记删除成功!\n"); return; } p = p->next; } printf("未找到该笔记!\n"); } // 查看笔记 void viewNote(struct Note *head) { if (head == NULL) { printf("当前没有笔记!\n"); return; } printf("所有笔记如下:\n"); struct Note *p = head; while (p != NULL) { printf("标题:%s\n", p->title); printf("内容:%s\n", p->content); p = p->next; } } int main() { struct Note *head = NULL; // 头结点指针初始化为空 int choice; while (1) { printf("请选择操作:\n"); printf("1. 添加笔记\n"); printf("2. 编辑笔记\n"); printf("3. 删除笔记\n"); printf("4. 查看笔记\n"); printf("5. 退出\n"); printf("请输入序号:"); scanf("%d", &choice); switch (choice) { case 1: addNote(&head); // 传入头结点指针的地址 break; case 2: editNote(head); break; case 3: deleteNote(&head); // 传入头结点指针的地址 break; case 4: viewNote(head); break; case 5: printf("退出笔记管理系统!\n"); return 0; default: printf("无效的选择!\n"); break; } } } ``` 上述代码,我们使用了链表来存储笔记,每个笔记结构体包含了标题、内容和指向下一个笔记结构体的指针。在添加、编辑、查看和删除笔记时,我们都使用指针来遍历链表,并实现相应的操作。 需要注意的是,在添加和删除笔记时,需要传入头结点指针的地址,因为头结点指针可能会发生变化,我们需要在函数修改头结点指针的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洋葱ycy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值