区别
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;
}