线性表的顺序存储和链式存储

线性表:

是由同类型数据元素构成有序序列的线性结构。

关于线性表:

表中元素个数成为线性表的长度;

线性表没有元素时,成为空表;

表的起始位置称为表头,表结束位置称为表尾;

线性表的顺序存储实现:

利用数组的连续存储空间顺序存放线性表的各元素;

创建一个线性表的模板:

typedef struct node*list;
   struct node{
        elementtype arr[200];
        int last;
   };
   struct node l;
   list ptrl;
   

访问下标为i的元素:l.arr[i]或ptrl->arr[i];

线性表的长度:l.last+1或ptrl->last+1;

 

list makeempty(){
        list p;
        p=(list)malloc(sizeof(struct node));
        p->last=-1;//last代表最后一个元素,所以last为0时代表这个表里
        //有一个元素放在第一个位置,没元素设为1;
        return p;//然后返回结构的指针
   }
int find(elementtype x,list p){
    int i=0;
    while(i<=p->last&&p->arr[i]!=x){
        i++;
    }
    if(i>p->last) return -1;//如果没找到返回-1
    else return i;//找到后返回的是存储位置
   }
先移动后插入
   void sert(elementtype x,int i,list p){
        int j;
        if(p->last==maxsize-1){
            cout<<"表空间已满,不能插入"<<endl;
            return ;
        }
        if(i<1||i>p->last+2){
            cout<<"插入的位置不合法"<<endl;
            return ;
        }
        for(int j=p->last;j>=i-1;j--){
            p->arr[j+1]=p->arr[j];//将i~n的元素倒序向后移动
        }
            p->arr[i-1]=x;//新元素插入
            p->last++;//多了一个元素,需要+1
            return ;
      }
      
void Delete(int i,list p){
                int j;
                if(i<1||i>p->last+1){
                    cout<<"不存在那个元素"<<endl;
                    return ;
                }
                
                for(int j=i;j<=p->last;j++){
                    p->arr[j-1]=p->arr[j];//将i+1~n元素的顺序向前移动
                }
                   p->last--;//last仍指向最后元素
                   return;
      }
      

关于线性表的链式存储:

求表长
      int length(list p){
         list a=p;//设置一个临时指针,指向表头第一个结点
          int j=0;
          while(a){
            a=a->Next;
            j++;
          }
            return j;
      }
//按序号查找
      list find(int k,list p){
            list a=p;
            int i=1;
            while(p!=NULL&&i<k){
                a=a->Next;
                i++;
            }
            if(i==k){
                return a;
            }else return NULL;
      }
      //按值查找
      list find(elementtype x,list p){
        list a=p;
          while(p!=NULL&&a->arr!=x){
                a=a->Next;
            }
            return a;
      }
      
      
list insert(elementtpe x,int i,list p){
            list a,s;
            if(i==1){       //新结点插入在表头,申请填装节点
                s=(list)malloc(sizeof(struct node));
                s->arr=x;
                s->next=p;
                return s;//返回新表头指针
            }
            
            a=find(i-1,p);//查找第i-1个结点
            if(a==NULL){  //第i-1个不存在,不能插入
                cout<<"参数i错了"<<endl;
                return NULL;
            }else{
                s=(list)malloc(sizeof(struct node));//申请填装结点
                s->arr=x;
                s->next=a->next;//新结点插入在第i-1个结点的后面
                a->next=s;
                return p;
            }
      }
      
list delete(int i,list p){
         list a,s;//若要删除的是表的第一个结点
         if(i==1){//s指向第一个结点
            s=p;
            if(p!=NULL) p=p->next;//从链表中删除
            else return NULL;
            free(s);//释放被删除结点
            return p;
         }
         a=find(i-1,p);//查找第i-1个结点
         if(a==NULL){
            printf("第i-1个结点不存在");
            return NULL;
         }else if(a->next==NULL){
            printf("第i个结点不存在");
            return NULL;
         }else{
            s=a->next;//s指向第i个结点
            a->next=s->next;//从链表中删除
            free(s);//释放被删除结点
            return p;
         }
      }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值