eg1:一元多项式及其运算
方法一:顺序存储结构直接表示。使用数组下标表示指数,对应值表示系数。弊端:不适合非零项多、指数大的多项式。
方法二:顺序存储结构表示非零项。使用二维数组存储指数和系数。弊端:不适合多项式的运算。
方法三:链表存储非零项。
由同类型数据元素,构成有序序列的线性结构。
类型名称:线性表(List)
数据对象集:0个及以上元素构成的有序序列。
操作集:初始化、增删查改、返回长度、由位序返回元素等。
1、结构体
typedef struct LNode *List;
struct LNode{
ElementType Data[MAXSIZE];
int Last; //最后一个元素的位置
};
struct LNode L;
List PtrL;
访问下标为i的元素:L.Data[i],PtrL->Data[i]
线性表长度:L.Last+1,PtrL->Last+1
2、主要操作实现
(1)初始化
List MakeEmpty(){
List PtrL;
PtrL = (list)malloc(sizeof(struct LNode));
PtrL->Last=-1;
return PatrL;
}
(2)查找
int Find(ElementType X, List PtrL){
int i=0;
while(i <= PtrL->Last && PtrL->Data[i]!=X){
i ++;
}
if(i>PtrL->Last) return -1;
else return i;
}
(3)插入
void Inserrt(ElementType X, int i, List PtrL){
int j;
if(PtrL->Last == MAXSIZE-1){
printf("表满");
return;
}
if(i<1||i>PtrL->Last+2){
printf("位置不合法");
return;
}
for(j=PtrL->Last;j>=i-1;j--){
PtrL->Data[j+1]=PtrL->Data[j];
PtrL->Data[i-1]=X;
PtrL->Last++;
return;
}
}
(4)删除
void Delete(int i, List PtrL){
int j;
if(i<1||i>PtrL->Last+1){
printf("不存在第%d个元素",i);
return;
}
for(j=i;j<=PtrL->Last;j++){
PtrL->Data[j-1] = PtrL->Data[j];
PtrL->Last--;
return;
}
}
1、结构体
typedef struct LNode *List;
struct LNode{
ElementType Data;
List Next;
};
struct LNode L;
List PtrL;
2、主要操作实现
(1)求表长
int Length(List PtrL){
List p=PtrL;
int j=0;
while(p){
p=p->Next;
j++;
}
return j;
}
(2)按序号查找
List FindKth(int K,List PtrL){
List p=PtrL;
int i=1;
while(p != NULL && i < K){
p=p->Next;
i++;
}
if(i==K){
return p;
}else{
return NULL;
}
}
(3)按值查找
List Find(ElementType X,List PtrL){
List p=PtrL;
while(p != NULL && p->Data != X){
p=p->Next;
}
return p;
}
(3)插入
List Insert(ElementType X,int i,List PtrL){
List p,s;
//表头
if(i==1){
s=(List)malloc(sizeof(struct LNode));
s->Data=X;
s->Next=PtrL;
return s;
}
p=FindKth(i-1,PtrL);
if(p==NULL){
printf("参数i错");
return NULL;
}else{
s=(List)malloc(sizeof(struct LNode));
s->Data=X;
s->Next=p->Next;
p->Next=s;
return PtrL;
}
}
(4)删除
List Delete(int i,List PtrL){
List p,s;
//表头
if(i=1){
s=PtrL;
if(PtrL!=NULL){
PtrL=PtrL->Next;
}else{
return NULL;
}
free(s);
return PtrL;
}
p=FindKth(i-1,PtrL);
if(p==NULL){
printf("第%d个结点不存在",i-1);
return NULL;
}else if(p->Next==NULL){
printf("第%d个结点不存在",i);
return NULL;
}else{
s=p->Next;
p->Next=s->Next;
free(s);
return PtrL;
}
}
广义表是线性表的推广。对于线性表而已,n个元素都是基本的单元素;广义表中,这些元素可以是单元素也可以是另一个广义表。结构体如下:
typedef struct GNode *GList;
struct GNode{
int Tag;
union{
ElementType Data;
GList SubList;
}URegion;
GList Next;
};
eg:矩阵可以用二维数组表示,但二维数组表示有两个缺陷:数组的大小需要事先确定、对于“稀疏矩阵”会造成大量的空间浪费。现在才用一种典型的多重链表——十字链表来存储稀疏矩阵A。
十字链表只存储非0元素、每个结点通过两个指针域把同行同列串起来。如下图所示:
Q:为什么说第1行和第1列的结点是同一个?为什么行数有5个?