线性表和链表

线性表和链表的区别及创建

区别

1.顺序线性表 (也就是用数组实现的,在内存中有顺序排列,通过改变数组大小实现,可以改变大小相当于动态数组),线性表初始大小需要知道。(需要分配初始内存)
2.链表 (不是用顺序实现的,用指针实现,在内存中不连续)。

线性表

线性表的创建

#include <stdio.h>
#include  <stdlib.h>

#define List_size 100  //线性表初始
#define LISTINCREAS 10 //线性表储存空间的分配增量
typedef struct{
      ElemType   *elem;//储存空间的基地址 同时elem指向一个元素
      int   length;//当前长度
      int   listsize;//当前分配的储存容量(单位是sizeof(ElemType))
}SqList;

Status InitList_Sq(SqList &L){//这里的&可以不要
 L.elem=(ElemType *)malloc(List_size*sizeof(ElemType));
 if(!L.elem) exit(overflow);//失败
 L.length = 0; //此时是空表所以为0
 L.listsize = List_size;//初始分配的容量
 return ok;
}

线性表的插入:
在这里插入图片描述注:第i个元素对应SqList.elem[i-1],计算时要按数组的情况来。
length 当前的长度 listsize是总长度

Status ListInsert(SqList &L,int i,ElemType e){//i是插入的元素的位置 e新插入的元素
 if(i<1||i>L.length)return Error;//i的大小不符合
 if(L.length>=L.listsize){
     newsize=(ElemType *)realloc(L.elem,(LISTINCREAS+L.listsize)*sizeof(ElemType));//整个容量增加    
}
if(!newsize) exit(OVERFLOW);
L.elem=newsize;
L.listsize+=LISTINCREAS;//100+10
int *p=&(L.elem[i-1]);//q为插入的位置(注意数组的下标是从0开始计数)
for(int *q=L.elem[L.length-1];q>p;q--){
   *q=*(q+1);
}
L.elem[i-1]=e; 
L.length++;//表长加一
return ok;    
}

线性表的删除:

Status ListDelete(SqList &L;int i;ElemType e){
   if(i<1||i>L.length) return ERROR;
   for(ElemType *p=L.elem[i-1];p<=&L.elem[L.length-1];p++)
      *p=*(p+1);
   L.length--;
  return OK;
}

链表

链表的创建

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status; 

typedef struct LNode{
   ElemType  elem;//元素
   struct LNode *next;//指向下一节点
}LNode,*LinkList;

void CreatList(LinkList L,int n){//创建长度为n的链表
  L=(LinkList)malloc(sizeof(LNode));//LinkList本来就是指针类型就不需要加*了
  LinkList head;
  head=L;
  L->next=NULL;
  for(int i=0;i<n;i++) {
   L=(LinkList)malloc(sizeof(LNode));
   scanf(&L->elem);
   L->next=L;
}
  
}

链表的删除

Status ListDelete(LinkList L,int i,ElemType e){
  p=L;
  j=1;
  if(p->next&&j<i){//要想删除i节点首先要找的i节点的位置
    p=p->next;++j;//这里的p最后指向i节点前面的一个节点
}
if(!(p->next)||j>i) return ERROR;
q=p->next; p->next=q->next;
e=q->next;
free(q);
return OK;
}

链表的归并

void MergeList(LinkList La,LinkList Lb,LinkList Lc){
    pa=La->next;
    pb=Lb->next;
    Lc=pc=La;
    while(pa&&pb) {
      if(pa->elem<=pb->elem) 
         {pc->next=pa; pc=pa->next;}
         else
         {pc->next=pb; pc=pb->next;}
    if(!pa)      
       pc->next=pb;
       else
       pc->next=pa;
       free(Lb);
  }

}

链表的插入

Status ListInsert(LinkList L,int i,ElemType e){
   p=L; j=0;
   while(p&&j<i-1){
   p=p->next; j++;//找到插入节点的前一个节点
}
if(j>i-1||!p) return ERROR;
LinkList s;
s=(LinkList)malloc(sizeof(LNode));
s->elem=e;
s->next=p->next;
p->next=s;
return OK;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值