数据结构学习 线性表 链表

一、线性表

定义;有同类型数据元素构成有序序列的线性结构

基本操作

  1. typedef int Position;
  2. typedef struct LNode *List;
  3. struct LNode {
  4.     ElementType Data[MAXSIZE];
  5.     Position Last;
  6. };
  7.  
  8. /* 初始化 */
  9. List MakeEmpty()
  10. {
  11.     List L;
  12.  
  13.     L = (List)malloc(sizeof(struct LNode));
  14.     L->Last = -1;
  15.  
  16.     return L;
  17. }
  18.  
  19. /* 查找 */
  20. #define ERROR -1
  21.  
  22. Position Find( List L, ElementType X )
  23. {
  24.     Position i = 0;
  25.  
  26.     while( i <= L->Last && L->Data[i]!= X )
  27.         i++;
  28.     if ( i > L->Last )  return ERROR; /* 如果没找到,返回错误信息 */
  29.     else  return i;  /* 找到后返回的是存储位置 */
  30. }
  31.  
  32. /* 插入 */
  33. /*注意:在插入位置参数P上与课程视频有所不同,课程视频中i是序列位序(从1开始),这里P是存储下标位置(从0开始),两者差1*/
  34. bool Insert( List L, ElementType X, Position P ) 
  35. /* 在L的指定位置P前插入一个新元素X */
  36.     Position i;
  37.  
  38.     if ( L->Last == MAXSIZE-1) {
  39.         /* 表空间已满,不能插入 */
  40.         printf("表满"); 
  41.         return false
  42.     }  
  43.     if ( P<0 || P>L->Last+1 ) { /* 检查插入位置的合法性 */
  44.         printf("位置不合法");
  45.         return false
  46.     
  47.     for( i=L->Last; i>=P; i-- )
  48.         L->Data[i+1] = L->Data[i]; /* 将位置P及以后的元素顺序向后移动 */
  49.     L->Data[P] = X;  /* 新元素插入 */
  50.     L->Last++;       /* Last仍指向最后元素 */
  51.     return true
  52.  
  53. /* 删除 */
  54. /*注意:在删除位置参数P上与课程视频有所不同,课程视频中i是序列位序(从1开始),这里P是存储下标位置(从0开始),两者差1*/
  55. bool Delete( List L, Position P )
  56. /* 从L中删除指定位置P的元素 */
  57.     Position i;
  58.  
  59.     if( P<0 || P>L->Last ) { /* 检查空表及删除位置的合法性 */
  60.         printf("位置%d不存在元素", P ); 
  61.         return false
  62.     }
  63.     for( i=P+1; i<=L->Last; i++ )
  64.         L->Data[i-1] = L->Data[i]; /* 将位置P+1及以后的元素顺序向前移动 */
  65.     L->Last--; /* Last仍指向最后元素 */
  66.     return true;   
  67. }
二、链表

链表的一些基本操作

  1. typedef struct LNode *PtrToLNode;
  2. struct LNode {
  3.     ElementType Data;
  4.     PtrToLNode Next;
  5. };
  6. typedef PtrToLNode Position;
  7. typedef PtrToLNode List;
  8.  
  9. /* 查找 */
  10. #define ERROR NULL
  11.  
  12. Position Find( List L, ElementType X )
  13. {
  14.     Position p = L; /* p指向L的第1个结点 */
  15.  
  16.     while ( p && p->Data!=X )
  17.         p = p->Next;
  18.  
  19.     /* 下列语句可以用 return p; 替换 */
  20.     if ( p )
  21.         return p;
  22.     else
  23.         return ERROR;
  24. }
  25.  
  26. /* 带头结点的插入 */
  27. /*注意:在插入位置参数P上与课程视频有所不同,课程视频中i是序列位序(从1开始),这里P是链表结点指针,在P之前插入新结点 */
  28. bool Insert( List L, ElementType X, Position P )
  29. /* 这里默认L有头结点 */
  30.     Position tmp, pre;
  31.  
  32.     /* 查找P的前一个结点 */        
  33.     for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ;            
  34.     if ( pre==NULL ) { /* P所指的结点不在L中 */
  35.         printf("插入位置参数错误\n");
  36.         return false;
  37.     }
  38.     else /* 找到了P的前一个结点pre */
  39.         /* 在P前插入新结点 */
  40.         tmp = (Position)malloc(sizeof(struct LNode)); /* 申请、填装结点 */
  41.         tmp->Data = X; 
  42.         tmp->Next = P;
  43.         pre->Next = tmp;
  44.         return true;
  45.     }
  46. }
  47.  
  48. /* 带头结点的删除 */
  49. /*注意:在删除位置参数P上与课程视频有所不同,课程视频中i是序列位序(从1开始),这里P是拟删除结点指针 */
  50. bool Delete( List L, Position P )
  51. /* 这里默认L有头结点 */
  52.     Position tmp, pre;
  53.  
  54.     /* 查找P的前一个结点 */        
  55.     for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ;            
  56.     if ( pre==NULL || P==NULL) { /* P所指的结点不在L中 */
  57.         printf("删除位置参数错误\n");
  58.         return false;
  59.     }
  60.     else /* 找到了P的前一个结点pre */
  61.         /* 将P位置的结点删除 */
  62.         pre->Next = P->Next;
  63.         free(P);
  64.         return true;
  65.     }
  66. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值