当前位置:   article > 正文

数据结构PT1——线性表/链表

数据结构PT1——线性表/链表

1:顺序存储实现(数组实现)

Data: a1 a2 .....ai ai+1 .... an ....

  1. typedef struct LNode *List; //指向LNode的指针,这是typedef的,你可以随时声明,而不加typedef只是创建一个
  2. struct LNode{    //结构体成员
  3.     ElementType Data[MAXSIZE];    //数组
  4.     int Last;  
  5. };
  6. struct LNode L;    //声明实例
  7. List PtrL;    //声明PtrL指针变量

访问第i个元素:L.Data[i]或者Ptr->Data[i]

线性表长度:L.Last+1或者PtrL->Last+1

    ​1>初始化

  1. List MakeEmpty() //返回List指针
  2. {
  3.     List Ptrl;
  4.     Ptrl = (List)malloc(sizeof(struct LNode)); //动态创建LNode,需要指向该结构的指针
  5.     Ptrl->Last = -1; //通常通过判断或者使得Last = -1,来使得一个新的空链表时初始化
  6.     return Ptrl;
  7. }

    ​2>查找

  1. int Find(ElementType X, List PtrL)
  2. {
  3. int i = 0;
  4. while(i <= PtrL->Last && PtrL -> Data[i] != X) //Last 是链表中最后一个元素的索引而不是元素个数,因为结构体中的Last声明过
  5. i++;
  6. if(i > PtrL -> Last)
  7. return -1;
  8. else return i;
  9. }

    ​3>插入

    ​先移动、再插入,比如在i位置插入x元素,要把i-1后面的元素全部向右移动一位

  1. void Insert(ElementType X,int i,List Ptrl)
  2. {
  3. int j;
  4. if(PtrL -> Last == MAXSIZE -1){
  5. print("表满");
  6. return;
  7. }
  8. if(i < 1 || i > PtrL ->Last + 2){
  9. printf("位置不合法");
  10. return;
  11. }
  12. for(j = Ptrl -> Last;j >= i-1;j- -)
  13. PtrL -> Data[j+1] = PrL -> Data[j]; //循环把j位置的元素给到j+1位置的元素
  14. PtrL -> Data[i-1] = X; //把i-1位置的元素替换成X
  15. PtrL -> Last++; //Last+1
  16. return
  17. }

    ​4>删除

    ​先删除、再移动

  1. void Delete(int i ,List PtrL)
  2. {
  3. int j;
  4. if(i < 1 || i > PtrL -> Last + 1){
  5. printf("不存在第%d个元素",i);
  6. return;
  7. }
  8. for(j=i ; j <= PtrL -> Last; j++)
  9. PtrL-> Data[j-1] = PtrL -> Data[j]; //循环把i+1位置的元素向左移动
  10. PtrL -> Last- -;
  11. return;
  12. }

2:链式存储实现

不要求逻辑相邻的两个元素物理上也相邻,通过“链”建立起元素上的逻辑关系

它的元素定义如下:它不再使用数组和int类型的末尾元素,而是Data和Next

  1. typedef struct LNode *List;
  2. struct LNode{
  3. ElementType Data;
  4. List Next;
  5. };
  6. struct LNode L;
  7. List PtrL;

链表由多个这样的“元素”连接而成,PtrL是指向该元素的指针,Next是指向下一个元素的指针,简单来说,Ptrl就是头指针,Next是尾指针

    ​1>求表长

  1. int Lenth(List PtrL) //只知道链表的头指针,单向链表
  2. {
  3. List p = PtrL; //临时指针P指向链表头
  4. int j = 0;
  5. while(p){ //p指针不结束
  6. p = p -> Next; //指向下一个
  7. j++;
  8. }
  9. return j;
  10. }

    ​2>查找

    按序号查找:FindKth;    ​(查找位于第K号的元素)

  1. List FindKth(int K,List PtrL)
  2. ​{
  3. ​ List p = PtrL;
  4. int i = 1;
  5. while(p != NULL && i < K){
  6. p = p-> Next;
  7. i++;
  8. }
  9. if(i == K) return p; //找到第K个,返回指针
  10. else return NULL; //没找到返回空
  11. }

    ​3->插入

    ​①s指向新节点

    ​②p指向链表的第i-1个节点

image.png

    ​找到修改指针,插入节点

    ③​把s指针赋给p指针的下一位,p -> Next = s;

    ​④把p的下一位赋值给s的下一位

  1. List Insert(ElementaType X ,int i , List PtrL) //在i位置插入元素X
  2. {
  3. List p ,s; //两个临时指针p,s
  4. if(i == 1){ //如果在表头插入
  5. s = (List)malloc(sizeof(struct LNode)); //(List) 将 malloc 返回的指针转换为 List 类型的指针,指向struct的指针
  6. s -> Data = X;
  7. s -> Next = PtrL; // 把原来的头指针给新元素的尾指针
  8. return s;
  9. }
  10. p = FindKth(i-1 , PtrL); //查找位于i-1位置的元素,把指向该位置的指针赋值给p
  11. if(p == NULL){
  12. printf("参数i错误");
  13. return NULL;
  14. }
  15. else{
  16. s = (List)malloc(sizeof(struct LNode));
  17. s -> Data = X;
  18. s -> Next = p -> Next; //s是新元素
  19. p -> Next = s;
  20. return PtrL;
  21. }

    ​4->删除

    ​①找到i-1个节点,用p指向

    ​②用s指向要被删除的节点(p的next)

    ​③修改指针,删除s指向节点

    ​④释放s空间

  1. List Delete(int i ,List PtrL)
  2. {
  3. List s, p;
  4. if( i == 1){
  5. s = PtrL;
  6. if(PtrL != NULL) PtrL = PtrL -> Next //从链表中删除s
  7. else return NULL;
  8. free(s); //释放s空间
  9. return PtrL;
  10. }
  11. p = FindKth(i-1 , PtrL); //查找i-1个节点
  12. if(p = = NULL){
  13. printf("第%d个节点不存在",i-1);return NULL;
  14. }else if( p -> Next == NULL){
  15. printf("第%d个节点不存在",i);return NULL;
  16. }else{
  17. s = p -> Next;
  18. p -> Next = s -> Next;
  19. free(s);
  20. return PtrL;
  21. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/456563
推荐阅读
相关标签
  

闽ICP备14008679号