2.1线性表

2.1.1多项式的表示

f(x)=a0+a1x+…+a[n-1]*x^(n-1)+ a[n]*x的n次方
如何表达 :A[i]
指数i
多项式项数n

顺序存储结构

1.直接表示

令n=i
在这里插入图片描述
问题:表示x+x^345的空间资源过于浪费

2.只表示非零项,将多项式项数看成二元表(n,A[i])

在这里插入图片描述用结构数组表示:数组分量是由指数,系数组成的结构

3.运算方便
按照指数大小有序存储
在这里插入图片描述

链表结构储存非零项

链表包括每个结点储存多项式中的一个非零项;包括系数和指数两个数据域和一个指针域

typedef struct PolyNode *Polynomial; 
struct PolyNode{  
	int A;  
	int n;  
	Polynomial link;
}

线性表描述

在这里插入图片描述

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

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

额外补充

摘自:
https://blog.csdn.net/Poo_Chai/article/details/100605509

typedef   struct   Student2   
    {   
    int   a;   
    }stu2;//stu2是一个结构体类型=struct Student   
 

stu2必须先 stu2 s2;
    然后 s2.a=10;

主要操作的实现

补充:malloc是动态内存分配函数。

a=(char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址,然后赋值给a

1.初始化

List MakeEmpty()
{
	List ptrL;
	ptrL = (List)malloc(sizeof(stuct LNode));
	ptrL->Last = -1;
	return ptrL
}

2.查找元素位置

int Find(ElementType h,List ptrL){
	int i = 0;
	while(i <= ptrL->Last && h!=ptrL->Data[i]){
		i++;
	}
	if (h!=ptrL->Data[i])
		return i;//找到后返回存储位置
	else
		return -1;
	
}

3.插入(第i(1<=i<=n+1)个位置上插入一个值为x的新元素)
在这里插入图片描述
从最后一个开始往后挪

void Insert(ElementType X,int i, List PtrL){
{
	int j ;
	//表满
	if(PtrL->Last = Maxsize-1)
		return;
	//满足(1<=i<=n+1)
	if(i<1 && i>PtrL->Last)
		return;
	//交换
	for(j = Maxsize+1;j>i; j--){
		PtrL->Data[j+1]=PtrL->Data[j];
	PtrL->Data[i]=X;
	PtrL->Last++;
	return;
	}
}

4.删除第i(1<=i<=n)个位置上的元素
在这里插入图片描述
注意第i个位置和数组从零开始

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

链式存储结构

不要求逻辑上相邻的两个元素物理上也相邻;通过‘链’建立逻辑关系

typedef struct Lnode* List;
struct Lnode{
	ElementType Data;
	List Next;
}
struct Lnode L;
List PtrL;

求长度

int Length(List PtrL)//List PtrL为头指针
{
	List p = PtrL;
	int j =0;
	while(p){
	p=p->next;
	j++;
	}
	return j;
}

查找

1.按序号查找

List FindKth(int K ,List PtrL)
{
	List p = PtrL;
	int i = 1;
	while (p!=null && K<i)
	{
		p=p->next;
		i++;
	}
	if(K = i) return p;
	else return null;
}

按值查找

List FindKth(ElementType X ,List PtrL){
	List p = PtrL;
	while(p!=null && X!=p->Data)
	{
	p=p->next;
	}
	return p ;
}

在这里插入图片描述
3.插入(在第i-1(1<=i<=n+1)个结点后插入一个值为x的新节点)
在这里插入图片描述
1.先造一个新节点,用s指针指向
2.p指向第i-1个节点
3.将新节点尾部接p->next
4.p指向s

List Insert(ElementType X,int i,List PtrL)
{	List p,s;
	if(i==1){
	s = (List)malloc(sizeof(struct LNode));
	s->next= PtrL;//PtrL头指针
	s->data=X;
	return s;
	}
	p=FindKth(i-1,PtrL);//查找第i-1个结点
	if(p==null){
		return null;
	}
	else{
		s = (List)malloc(sizeof(struct LNode));
		s->data = X;
		s-> next = p->next;
		p->next = s;
		return PtrL;
	}
}
4.删除(删除链表的第i (1<i<n)个位置上的结点)

在这里插入图片描述

List Delete (int i,List PtrL)
{
	List p,s;
	if (i==1){
		s=PtrL;
		if(PtrL = null) return null;//先检查PtrL头结点是否为空
		else PtrL = PtrL->next;
		free(s);
		return PtrL;
	}
	p=FindKth(i-1,PtrL);//查找第i-1个结点
	if(p==null)                return null;
	elseif(p->next=null) return null;
	else{
	s = p->next;
	p->next = p->next->next;
	free(s);
	return PtrL;
	}
	
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值