文章目录
- 线性表
- 动态分配的顺序存储结构
- 链式存储
线性表
动态分配的顺序存储结构
通过分析代码,我们发现,要注意什么:
- 要分清你的下标
- Insert 函数是可以用来没有元素的时候,增加元素的
- Init(或者Create )函数一般只用来分配空间等的初始化
//动态分配空间的顺序存储结构的线性表
#include<stdio.h>
#include<stdlib.h>#define Linitesize 100
#define Laddsize 10
#define OK 1
#define error 0typedef int Status;
typedef int Elemtype;
typedef struct{Elemtype * elem;int length;int listsize;
}SqList;
void Show(SqList L)
{int i;for(i=0;i<L.length ;i++)printf("%d ",L.elem[i]);printf("\n");return ;
}
Status Create(SqList &L)
{L.elem = (Elemtype *)malloc(Linitesize*sizeof(Elemtype));if(!(L.elem ))return error;L.length = 0;L.listsize = Linitesize;return OK;
}
//在第i个元素之前插入 ,从1开始计数,就是下标为i
Status Insert(SqList &L,int i,Elemtype e)
{int j;if(i<1||i>L.length+1 )return error;if(L.length>=L.listsize){L.elem =(Elemtype *)realloc(L.elem ,(L.listsize + Laddsize)*sizeof(Elemtype));if(!(L.elem ))return error;L.listsize = L.listsize + Laddsize;}for(j=L.length-1 ;j>=i-1;j--)L.elem[j+1] = L.elem[j];L.elem[i-1] = e;L.length ++;return OK;}
//i为你想要删除的第几个元素
Status Delete(SqList &L,int i,Elemtype &e)
{int j;if(i<1||i>L.length )return error;e = L.elem[i-1];for(j=i-1;j<L.length-1;j++)L.elem[j] = L.elem[j+1];L.length --;return OK;
}int main()
{int i,j;Elemtype e;SqList L;Create(L);for(i=1;i<=5;i++)Insert(L,i,i*i); printf("输出具体数据:\n");Show(L);printf("请输入你想要删除第几个元素:\n");scanf("%d",&j);Delete(L,j,e);printf("删除的数据是:%d \n",e);Show(L);return 0;
}
考点
- 两个有序递增的顺序表的合并
关键点,可以学到什么,就是分别用pa,pb,pc,来记录首地址,一句话,就是用辅助变量来方便操作
void Merge(Sqlist la,Sqlist lb,Sqlist &lc)
//目标,将原本有序递增的la,pb顺序表整合到lc ,lc认为有序递增的
{pa = la.elem;pb = la.elem;lc.listsize = lc.length = la.length + lb.length;pc =lc.elem = (ElemType *)malloc(lc.listsize*(sizeof(ElemType)));if(!lc.elem)exit OVERFLOW;pa_last = pa + la.length-1;pb_last = pb + lb.length-1;while(pa<=pa_last&&pb<=pb_last){if(*pa<*pb) *pc++ = *pa++;else *pc++ = *pb++;}while(pa<=pa_last) *pc++ = *pa++;while(pb<=pb_last) *pc++ = *pb++;}
顺序表优点与缺点
:
- 优点:可以随便进行数据的插入与删除
- 优点:占据较少的空间
- 缺点:需要连续的一串地址
- 缺点:在插入与删除时,要移动大量的元素
链式存储
//动态分配空间的顺序存储结构的线性表
#include<stdio.h>
#include<stdlib.h>#define Linitesize 100
#define Laddsize 10
#define OK 1
#define error 0typedef int Status;
typedef int Elemtype;typedef struct LNode{struct LNode * next;Elemtype data;
}LNode,*LinkList;
int Length(LinkList L)
{int sum=0;while(L->next !=NULL){sum++;L=L->next ;}return sum;
}
//尾插法
Status Create(LinkList &L,Elemtype e)
{LinkList p = L;//开始p 指向头结点 while(p->next !=NULL )//找到最后一个结点 p=p->next ;LinkList temp = (LNode *)malloc(sizeof(Elemtype));if(!temp) return error;temp->data = e;//由于p 指向最后一个结点,那么p->next 进行赋值,实际上会改变原来的数据temp->next = p->next ;p->next = temp;return OK;}
Status Show(LinkList L)
{LinkList p = L->next ;while(p !=NULL){printf("%d ",p->data );p = p->next ;}printf("\n");return OK;
}
//在第i 个元素之前插入 ,确保不超过范围
Status Insert(LinkList &L,int i,Elemtype e)
{if(i<1||i>Length(L)+1)return error;LinkList p = L;//指向头结点//找到第i-1个结点int j ;for(j=1;j<i;j++)p = p->next ; LinkList temp = (LNode * )malloc(sizeof(LNode));if(!temp) return error;temp->data = e;temp->next = p->next ;p->next = temp;return OK;
}
Status Delete(LinkList &L,int i,Elemtype &e)
{//删除第i 个元素,并返回其值if(i<1||i>Length(L))return error;//找到第i-1个结点int j;LinkList temp = L;for(j=1;j<i;j++)temp = temp->next ;e = temp->next->data;temp->next = temp->next->next;return OK;
}
int main()
{Elemtype e;LinkList L = (LNode *)malloc(sizeof(LNode));L->next = NULL;for(int i = 1;i<= 5;i++)Create(L,i);Show(L);Insert(L,2,10);Show(L);Delete(L,3,e);Show(L);printf("%d \n",e);return 0;}
应用
: