线性表

线性表的基本操作的实现 顺序表基本操作的实现 *线性表的基本操作 InitList(&L) //初始化操作,建立一个空的线性表L DestroyList(&L) //销毁已存在的线性表L ClearList(&L) //将线性表清空 ListInsert(&L,i,e) //在线性表L中第i个位置插入新元素e ListDelete(&L,i,& 阅读详情

1.基本概念

n个数据元素的有限序列

2 抽象数据类型(ADT)

数据对象:{a1,a2,.....,an},每个元素类型为DataType。

数据关系:除第一个元素外,每一个元素有且只有一个直接前驱元素;除最后一个元素外,每个元素有且只有一个直接后驱。一对一的对应关系。

基本操作:

                InitList(*L): 初始化操作,建立一个空列表L。

                ListEmpty(L): 若列表为空,返回True,否则返回False。

               ClearList(*L): 将线性表清空。

               GetElem(L,i,*e): 将线性表L中第i个位置的元素值返回给e。

               LocateElme(L,e): 查找线性表L中与给定值e相等元素的位置,如果查找成功,返回序号,否则返回0。

               ListInsert(*L,i,e): 在线性表L第i个位置插入元素e,长度加1。

               ListDelete(*L,i,*e): 删除线性表L第i元素,并将其值通过e返回,长度减1。

               ListLength(L): 返回线性表L的元素个数。

3 线性表的顺序存储

用一段地址连续的存储单元依次存储线性表的数据元素

#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#include <stdlib.h>
#include <stdio.h> 
//线性表的顺序存储结构定义 
#define LIST_INIT_SIZE 100    //线性表初始分配的存储空间容量,可以存储100个元素 
#define INCREMENT 10          //当存储空间不足时,每次新增的存储空间容量 
typedef int ElemType;         //元素的数据类型根据实际情况而定,这里假设为int 
typedef struct
{
	ElemType *elem;          //线性表的基地址 
	int length;              //线性表中元素的个数 
	int listsize;            //线性表中存储空间容量 
}SqList;

//线性表的顺序存储操作

int InitList(SqList*L)   //建立空表 
{
	L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if (!(L->elem)) return ERROR;
	L->length=0;
	L->listsize=LIST_INIT_SIZE;
	return OK;
}

int ListEmpty(SqList L)   //表是否为空 
{
	if (L.length) return FALSE;
	else return TRUE;
}

int ClearList(SqList*L)   //清空 
{
	if (L->length) 
	{
		L->length=0;
	}
	return OK;
}

int GetElem(SqList L,int i,ElemType*e)  //获取第i个元素的值 
{
	if (L.length==0||(i<1)||(i>L.length)) return ERROR;
	*e=*(L.elem+i-1);
	return OK;
}

int LocateElme(SqList L,ElemType e)   //查找与e值相等元素在表中的位置 
{
	int i;
	if (L.length==0) return FALSE;
	for (i=0;i<L.length;i++)
	{
		if (e==*(L.elem+i))
		{
			return i+1;
		}
	}
	return FALSE;
}

int ListInsert(SqList*L,int i,ElemType e)   //将e插入表中第i个元素 
{
	int j;
	if (i<1||i>(L->length+1)) return ERROR;
	if (L->length>=L->listsize)
	{
		L->elem=(ElemType*)realloc(L->elem,(L->listsize+INCREMENT)*sizeof(ElemType));
		if (!L->elem) return ERROR;
		L->listsize+=INCREMENT;
	}
	for (j=L->length;j>=i;j--)
	{
		*(L->elem+j)=*(L->elem+j-1);
	}
	*(L->elem+j)=e;
	L->length++;
	return OK;
}

int ListDelete(SqList*L,int i,ElemType*e)  //删除第i个元素,并将值返回给e 
{
	if (i<1||i>(L->length)||L->length==0) return ERROR;
	*e=*(L->elem+i-1);
	for (i--;i<L->length-1;i++)
	{
		*(L->elem+i)=*(L->elem+i+1);
	}
	L->length--;
	return OK;
	 
}

int ListLength(SqList L)   //获取表的长度 
{
	return L.length;
}

int main()
{
	SqList L;
	int e,choice,i; 
	do{
		e=0;
		printf("输入操作: 0.退出 1.返回表长度 2.插入 3.删除 4.获取元素值 5.验证表是否为空 6.清空表 7.创建表 8.查找元素位置\n");
		scanf("%d",&choice);
		switch (choice)
		{
			case 1:
			{
				e=ListLength(L);
				printf("%d\n",e);
				break;
			}
			case 2:
			{
				printf("输入插入元素值\n");
				scanf("%d",&e);
				printf("输入插入位置\n");
				scanf("%d",&i); 
				ListInsert(&L,i,e);
				break;
			}
			case 3:
			{
				printf("输入删除位置\n");
				scanf("%d",&i); 
				ListDelete(&L,i,&e);
				printf("%d\n",e);
				break;
			}
			case 4:
			{
				printf("输入元素位置\n");
				scanf("%d",&i); 
				GetElem(L,i,&e);
				printf("%d\n",e);
				break;
			}
			case 5:
			{
				printf("%d\n",ListEmpty(L));
				break;
			}
			case 6:
			{
				ClearList(&L);
				break;
			}
			case 7:
			{
				InitList(&L);
				break;
			}
			case 8:
			{
				printf("输入查找元素值\n");
				scanf("%d",&e);
				printf("%d\n",LocateElme(L,e));
				break;
			}
		}
		printf("[");
		for (i=0;i<L.length;i++) printf("%d ",*(L.elem+i));
		printf("]\n");
	}while(choice!=0); 
	return 0;
}

4 线性表的链式存储

用一组任意的存储单元来存储线性表中的数据元素,利用存储地址信息来指示下一个元素所在地址。

单链表:

#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#include <stdlib.h>
#include <stdio.h> 
//线性表的链式存储结构定义  
typedef int ElemType;         //元素的数据类型根据实际情况而定,这里假设为int 
typedef struct Node 
{
	ElemType data;            //数据域,用于存储结点数据 
	struct Node *next;        //指针域,存储下一个结点的地址信息              
}Node,*LinkList;

//线性表的链式存储操作
//	int InitList(LinkList *L,int n)  //建立单链表,其中L为链表头指针的地址,n为元素个数(头插法)                  
//	{
//		int i;
//		Node*p;
//		(*L)=(LinkList)malloc(sizeof(Node));  
//		if (!(*L)) return ERROR;
//		(*L)->next=NULL;           //建立一个带头结点的单链表
//		for (i=0;i<n;i++)           
//		{
//			p=(Node*)malloc(sizeof(Node));
//			scanf("%d",&p->data); 
//			p->next=(*L)->next;    //将新节点的指针指向原来头结点的指针所指向的那个结点 
//			(*L)->next=p;          //将头结点的指针指向新节点 
//		} 
//		return OK;
//	}

int InitList(LinkList *L,int n)  //建立单链表,其中L为链表头指针的地址,n为元素个数(尾插法)                  
{
	int i;
	Node*p,*r;
	(*L)=(LinkList)malloc(sizeof(Node));  
	if (!(*L)) return ERROR;
	(*L)->next=NULL;           //建立一个带头结点的单链表
	r=(Node*)malloc(sizeof(Node));
	(*L)->next=r;              //建立第一个元素结点,将头结点的指针指向它 
	r->next=NULL;               
	scanf("%d",&r->data);
	for (i=1;i<n;i++)           
	{
		p=(Node*)malloc(sizeof(Node));
		scanf("%d",&p->data); 
		r->next=p;            //将最后一个结点的指针指向新结点 
		r=p;                  //将新节点定义为最后一个结点 
	} 
	r->next=NULL;            //将最后一个结点的指针指向空 
	return OK;
}

int GetElem(LinkList L,int i,ElemType *e)     //获取链表的第i个元素的值,并返回给e 
{
	int j=1;
	Node*p; 
	p=L->next;
	while (p && j<i)            //寻找第i个元素的位置 
	{
		p=p->next;
		j++;
	}
	if (!p || j>i) return ERROR;   //若i小于1或i大于表长,则返回错误 
	*e=p->data;
	return OK; 
}

int LocateElme(LinkList L,ElemType e)
{
	int i=1;
	Node*p;
	p=L->next;
	while(p)           //遍历整个表 
	{
		if (e==p->data) return i;
		i++;
		p=p->next;
	}
	return FALSE;     //查找失败 
}

int ListInsert(LinkList L,int i,ElemType e)
{
	int j=1;
	Node*p,*s;
	p=L;
	while(p && j<i)
	{
		p=p->next;
		j++;
	}
	if (j>i||!p) return ERROR;
	s=(Node*)malloc(sizeof(Node));       //申请新结点的空间 
	s->data=e;                          //载入数据 
	s->next=p->next;                   //使新节点的指针指向后一个结点 
	p->next=s;                         //使前一个结点的指针指向新节点 
}

int ListDelete(LinkList L,int i, ElemType*e)
{
	int j=1;
	Node*p,*q;
	p=L;
	while(p && j<i)
	{
		p=p->next;
		j++;
	}
	if (!p || j>i) return ERROR;
	q=p->next;              //定义当前结点 
	*e=q->data;             //返回将要删除的当前结点数据 
	p->next=q->next;        //使当前结点的前结点指针指向当前结点的后结点 
	free(q);                //释放当前结点 
	return OK;
}

int ClearList(LinkList*L)
{
	Node*p,*q;
	p=(*L)->next;
	while(p)
	{
		q=p->next;         //记录当前结点的后结点 
		free(p);           //释放当前结点 
		p=q;               //将记录的后结点定义为当前结点 
	}
	(*L)->next=NULL;
	return OK;
}

int ListLength(LinkList L)
{
	int i=0;
	Node*p;
	p=L->next;
	while(p)       //遍历整表 
	{
		p=p->next;       
		i++;
	}
	return i;
	
}


int main()
{
	LinkList L;
	Node*p;
	int e,choice,i; 
	do{
		e=0;
		printf("输入操作: 0.退出 1.返回表长度 2.插入 3.删除 4.获取元素值 5.清空表 6.创建表 7.查找元素位置\n");
		scanf("%d",&choice);
		switch (choice)
		{
			case 1:
			{
				e=ListLength(L);
				printf("%d\n",e);
				break;
			}
			case 2:
			{
				printf("输入插入元素值\n");
				scanf("%d",&e);
				printf("输入插入位置\n");
				scanf("%d",&i); 
				ListInsert(L,i,e);
				break;
			}
			case 3:
			{
				printf("输入删除位置\n");
				scanf("%d",&i); 
				ListDelete(L,i,&e);
				printf("%d\n",e);
				break;
			}
			case 4:
			{
				printf("输入元素位置\n");
				scanf("%d",&i); 
				GetElem(L,i,&e);
				printf("%d\n",e);
				break;
			}
			case 5:
			{
				ClearList(&L);
				break;
			}
			case 6:
			{
				printf("输入初始元素个数\n");
				scanf("%d",&i);
				InitList(&L,i);
				break;
			}
			case 7:
			{
				printf("输入查找元素值\n");
				scanf("%d",&e);
				printf("%d\n",LocateElme(L,e));
				break;
			}
		}
		printf("[");
		p=L->next;
		while (p)            
		{
			printf("%d ",p->data);
			p=p->next;
		}
		printf("]\n");
	}while(choice!=0); 
	return 0;
}

静态链表:用数组描述的链表,数组元素由两个数据域组成,data和cur。data用于存放数据元素,cur相当于单链表的next指针,叫做游标。

#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#include <stdlib.h>
#include <stdio.h> 
//静态链表结构定义
#define MAXSIZE 1000  
typedef int ElemType;         //元素的数据类型根据实际情况而定,这里假设为int 
typedef struct
{
	ElemType data;            //数据域,用于存储结点数据 
	int cur;                 //游标,存储下一个结点的下标信息              
}Component,SLinkList[MAXSIZE];

//线性表的链式存储操作
int InitList(SLinkList L)       //初始化静态链表         
{
	int i;
	for (i=0;i<MAXSIZE-1;i++)    //除第一和最后一个结点,每个结点的游标都为后结点的下标 ,第一个结点的游标为备用链表的第一个结点下标 
	{
		L[i].cur=i+1;
	}
	L[MAXSIZE-1].cur=0;         //最后一个结点的游标为指向第一个有元素的结点,相当于头结点,由于此时没有元素,用0表达空指针。 
	return OK;
}

int GetElem(SLinkList L,int i,ElemType *e)   //获取第i个元素的值 
{
	int j,num=1;
	j=L[MAXSIZE-1].cur;
	while (j && num<i)                //查找第i个元素的下标 
	{
		j=L[j].cur;
		num++;
	}
	if ((num>i)||!j) return ERROR;      //若i小于1或第i个位置元素不存在,返回错误 
	*e=L[j].data;                      //返回值 
	return OK;
}

int LocateElme(SLinkList L,ElemType e)   //查找与e相等元素的下标 
{
	int i,num=1;
	i=L[MAXSIZE-1].cur;
	while(i)
	{
		if (L[i].data==e)    //若下标i的元素值与e相等,则返回下标 
		{
			return num;
		}else
		{
			i=L[i].cur;
			num++;
		}
	}
	return FALSE;          //查找失败 
}

int Malloc_SL(SLinkList L)       //向备用链表申请一个存储空间 
{
	int i=L[0].cur;
	if (i) L[0].cur=L[i].cur;
	return i; 
}

int free_SL(SLinkList L,int k)  //释放一个存储空间到备用链表 
{
	L[k].cur =L[0].cur;
	L[0].cur =k;
	return OK;
}

int ListInsert(SLinkList L,int i,ElemType e)    //插入一个值为e的元素到第i个位置之前 
{
	int j,num,s;
	if (i<1||(i>ListLength(L)+1)) return ERROR;
	j=MAXSIZE-1;
	for (num=1;num<i;num++) 
	{
		j=L[j].cur;
	}
	s=Malloc_SL(L);
	L[s].data=e;
	L[s].cur=L[j].cur;            //使新结点的游标指向原来第i个结点 
	L[j].cur=s;                  //使第i-1个结点的游标指向新节点 
	return OK;
}

int ListDelete(SLinkList L,int i, ElemType*e)  //删除第i个元素,并将元素值返回给e 
{
	int j,num=1,k;
	if (i<1||i>ListLength(L)) return ERROR;
	j=MAXSIZE-1;
	for (num=1;num<i;num++) 
	{
		j=L[j].cur;
	}
	k=L[j].cur;             
	L[j].cur=L[k].cur;    //将第i-1个结点的游标指向第i+1个结点 
	*e=L[k].data;         //将第i个结点值返回 
	free_SL(L,k);         //释放第i个结点 
	return OK;
}

int ClearList(SLinkList L)      //静态链表的清空操作和初始化操作相同 
{
	int i;
	for (i=0;i<MAXSIZE-1;i++)     
	{
		L[i].cur=i+1;
	}
	L[MAXSIZE-1].cur=0;         
	return OK;

}

int ListLength(SLinkList L)   //返回链表的长度 
{
	int num=0,j;
	j=L[MAXSIZE-1].cur;
	while(j)
	{
		j=L[j].cur;
		num++;
	}
	return num;
}

int main()
{
	SLinkList L;
	int e,choice,i; 
	do{
		e=0;
		printf("输入操作: 0.退出 1.返回表长度 2.插入 3.删除 4.获取元素值 5.清空表 6.创建表 7.查找元素位置\n");
		scanf("%d",&choice);
		switch (choice)
		{
			case 1:
			{
				e=ListLength(L);
				printf("%d\n",e);
				break;
			}
			case 2:
			{
				printf("输入插入元素值\n");
				scanf("%d",&e);
				printf("输入插入位置\n");
				scanf("%d",&i); 
				ListInsert(L,i,e);
				break;
			}
			case 3:
			{
				printf("输入删除位置\n");
				scanf("%d",&i); 
				ListDelete(L,i,&e);
				printf("%d\n",e);
				break;
			}
			case 4:
			{
				printf("输入元素位置\n");
				scanf("%d",&i); 
				GetElem(L,i,&e);
				printf("%d\n",e);
				break;
			}
			case 5:
			{
				ClearList(L);
				break;
			}
			case 6:
			{
				InitList(L);
				break;
			}
			case 7:
			{
				printf("输入查找元素值\n");
				scanf("%d",&e);
				printf("%d\n",LocateElme(L,e));
				break;
			}
		}
		i=L[MAXSIZE-1].cur;
		printf("[");
		while(L[i].data)
		{
			printf("%d ",L[i].data);
			i=L[i].cur;
		}
		printf("]\n");
	}while(choice!=0); 
	return 0;
}

循环链表:将单链表的终端结点的指针由空指针改为指向头结点,使整个单链表形成一个环。与单链表的区别在于算法中的循坏条件不是判断p->next是否为空,而是他们是否指向头结点。为了操作方便,有时候不用头指针,而用尾指针,这样可以快速的访问到第一个结点和最后一个结点。还可以方便的将两个循坏链表合并为一个循坏链表:

#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#include <stdlib.h>
#include <stdio.h> 
//线性表的链式存储结构定义  
typedef int ElemType;         //元素的数据类型根据实际情况而定,这里假设为int 
typedef struct Node 
{
	ElemType data;            //数据域,用于存储结点数据 
	struct Node *next;        //指针域,存储下一个结点的地址信息              
}Node,*CLinkList;
//rearA为循坏链表A的尾指针,rearB为循环链表B的尾指针
//如下操作将两个链表合并
int extend(CLinkList rearA,CLinkList rearB)
{
	Node*p,*q;
	p=rearA->next;                  //保存A链表的头结点 
	rearA->next=rearB->next->next;  //使A链表的最后一个结点指向B链表的第一个结点 
	q=rearB->next;                  //保存B链表的头结点 
	rearB->next=p;                  //使B链表的最后一个结点指向A链表的头结点 
	free(q);                        //释放B链表的头结点 
} 

双向链表:在单链表的每个结点中,再设置一个指向其前驱结点的指针域。

#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#include <stdlib.h>
#include <stdio.h> 
//双向链表的存储结构定义  
typedef int ElemType;         //元素的数据类型根据实际情况而定,这里假设为int 
typedef struct Node 
{
	ElemType data;            //数据域,用于存储结点数据 
	struct Node *prior;       //指针域,存储前一个结点的地址信息 
	struct Node *next;        //指针域,存储后一个结点的地址信息              
}Node,*DLinkList;

//双向链表的查找元素GetElme、获取元素位置LocateElme、返回长度ListLength操作与单链表类似

int ListInsert(DLinkList L,int i,ElemType e) //在第i个位置前插入元素e 
{
	Node*p,*s;
	int j=1;
	p=L->next;
	while(p&&j<i)      //查找第i个位置 
	{
		p=p->next;
		j++;
	}
	if (!p||j>i) return ERROR;
	if (!(s=(Node*)malloc(sizeof(Node)))) return ERROR;
	s->data=e;     
	s->next=p;               //使新节点的后指针指向第i个结点 
	s->prior=p->prior;       //使新节点的前指针指向第i-1个结点 
	p->prior->next=s;        //使第i-1个结点的后指针指向新节点 
	p->prior=s;              //使第i个结点的前指针指向新节点 
	return OK;
} 

int ListDelete(DLinkList L,int i,ElemType *e)   //删除第i个元素,并将其值返回给 
{
	Node*p;
	int j=1;
	p=L->next;
	while(p&&j<i)            //找到第i个元素结点的位置 
	{
		p=p->next;
		j++;
	}
	if (!p||j>i) return ERROR;
	*e=p->data;
	p->prior->next=p->next;        //使当前结点的前一个结点的后指针指向当前结点的后一个结点 
	p->next->prior=p->prior;       //使当前结点的后一个结点的前指针指向当前结点的前一个结点 
	free(p);                       //释放当前结点 
	return OK;
}

int InitList(DLinkList*L,int n)     //尾插法建立双向循坏链表 
{
	int i;
	Node*p,*q;
	if(!((*L)=(DLinkList)malloc(sizeof(Node)))) return ERROR;      //建立头结点 
	(*L)->next=NULL;
	(*L)->prior=NULL;
	q=(Node*)malloc(sizeof(Node));         //第一个元素结点 
	(*L)->next=q;                        //头结点后指针指向第一个元素结点 
	q->prior=(*L);                      //第一个结点的前指针指向头结点 
	q->next=NULL;                       //第一个结点的后指针指向空 
	scanf("%d",&q->data);
	for (i=1;i<n;i++)
	{
		p=(Node*)malloc(sizeof(Node));
		scanf("%d",&p->data);
		q->next=p;                      //前一个结点的后指针指向新节点 
		p->prior=q;                     //新节点的前指针指向前一个结点 
		q=p;                             
	}
	q->next=(*L);                      //使最后一个结点的后指针指向头结点,形成环 
	(*L)->prior=q;                     //使头结点的前指针指向最后一个结点,形成环 
	return OK;
}

int main()
{
	DLinkList L;
	Node*p;
	int e,choice,i; 
	do{
		e=0;
		printf("输入操作: 0.退出 1.插入 2.删除 3.创建表\n");
		scanf("%d",&choice);
		switch (choice)
		{
			case 1:
			{
				printf("输入插入元素值\n");
				scanf("%d",&e);
				printf("输入插入位置\n");
				scanf("%d",&i); 
				ListInsert(L,i,e);
				break;
			}
			case 2:
			{
				printf("输入删除位置\n");
				scanf("%d",&i); 
				ListDelete(L,i,&e);
				printf("%d\n",e);
				break;
			}
			case 3:
			{
				printf("输入初始元素个数\n");
				scanf("%d",&i);
				InitList(&L,i);
				break;
			}
		}
		printf("[");
		p=L->next;
		while (p!=L)   
		{
			printf("%d ",p->data);
			p=p->next;
		}
		printf("]\n");
	}while(choice!=0); 
	return 0;
}

5 总结

线性表有顺序存储和链式存储两种方式。顺序存储的优点在于存取元素快,时间复杂度为O(1),但其缺点在于长度往往固定,对存储空间利用率不高,且插入和删除操作慢,时间复杂度为O(n)。链式存储的优点在于其可以动态分配存储空间,且插入和删除操作快,时间复杂度为O(1),但其存取操作较慢,时间复杂度为O(n)。


线性表的应用:将所有在线性表Lb中但不在线性表La中的元素插入线性表La #include&amp;lt;iostream&amp;gt; #include&amp;lt;stdio.h&amp;gt; #include &amp;lt;malloc.h&amp;gt; using namespace std; #define MaxSize 50 typedef char ElemType; typedef struct { ElemType elem[MaxSize]; //存放顺序表中 阅读详情

相关推荐

C&C++线性表实训

第1关:顺序构建线性表 本关任务:按照数据输入的顺序构建一个线性表。即如果输入的3个结点数据分别为1、2、3,则构建的线性表包含3个结点,且从前往后的结点数据分别为1、2、3。 #include "linearList.h" node *insertTail(node *h, node *t) { if(h == NULL) // 空链表单独处理 { t->next = NULL; // 链表尾指针置为NULL return t; // 返回第一个结点

Junds0的博客 4036

c语言查找算法LocateElem,关于LocateElem算法

满意答案1、LocateElem(L,e,compare())函数:初始条件:线性表存在,compare()是数据元素判定函数;操作结果:返回第一个与e满足关系compare()的数据元素的位序。若不存在,返回0.由定义的结构体知:typedef struct{char Name[100]; //学生姓名char Number[100]; //学生的学号} StudentRacord;如何...

weixin_33182798的博客 6658

海康摄像头RTSP流延迟优化实战:从VLC到OpenCV的5种方案对比与性能调优

本文针对海康摄像头RTSP流的高延迟问题,深入剖析了延迟根源,并系统对比了从VLC、OpenCV到海康官方SDK、FFmpeg及硬件加速等五种主流方案的性能表现。重点分享了缓冲区设置、协议优化、多线程架构与硬件解码等实战调优技巧,旨在帮助开发者将视频流延迟从秒级优化至毫秒级,满足工业检测、安防监控等高实时性场景需求。

hh234的博客 806

数据结构之线性表(1)

线性表:零个或多个数据元素的有限序列。 在较复杂的线性表中,一个数据元素可以由若干个数据项组成。 线性表抽象类型定义: ADT 线性表(List) Data: Operation: InitList(*L) //初始化线性表 ListEmpty(L) //线性表为空返回true,否则返回false ...

yeyueyouhun的博客 239

手把手教你自制Type-C OTG转换器(附电路图及避坑指南)

本文详细指导如何自制Type-C OTG转换器,包括核心电路设计、元器件选型及焊接技巧,特别强调硬件检测电路的关键作用。通过实测数据和避坑指南,帮助开发者解决兼容性问题,实现高效数据传输。

weixin_27038245的博客 713

Python小白避坑指南:用Ursina做3D图形,Entity的scale和color参数到底怎么调才不出错?

本文详细解析了Python Ursina引擎中Entity对象的scale和color参数调优技巧,帮助3D图形编程初学者避开常见陷阱。通过对比实验和典型场景分析,深入讲解三种缩放方式的区别、颜色定义的四种方法,以及参数组合的协同效应,助力开发者精准控制3D图形表现。

weixin_26782929的博客 413

数据结构_顺序表实现及其操作

数据结构_顺序表实现及其操作 程序大量参考自王道《数据结构》以及博主lady_killer9的数据结构专栏 主要实现顺序表的建立,顺序表的基本操作以及部分王道课后习题: 顺序表基本操作实现顺序表的基本操作 InitList(SqList &L): 初始化表,构造一个空的线性表; Length(SqList L): 求表长。返回线性表L的长度; LocateElem(SqList L,ElemType e): 按值查找,查找表中是否有值e; GetElem(SqList L,i

qq_43650119的博客 1448

智能体在车联网中的应用:第19天 智能体理论与初步实践 D30:阶段小结——在SUMO中使用TraCI控制预编程智能体

本文介绍了如何将强化学习从算法仿真迁移到交通系统实践,重点讲解了SUMO微观交通仿真平台与TraCI实时控制接口的架构。通过构建一个预编程驾驶智能体,演示了车辆从起点到目标点的导航控制。文章详细解析了TraCI的双向通信机制和事件驱动模型,对比了其与传统RL环境的差异,并提供了完整的Python实现框架,包括路网配置、车辆控制和基于向量场的导航逻辑。该实践为后续开发高级学习型交通智能体奠定了基础。

IT深耕十余载,大道之简 1478

学习笔记(2)

目录前言问题解答 前言 有一个问题之前一直不明白,今天突然明白了。 问题 之前学线性表时,有建立链表、插入、删除、查找元素等操作。以下是函数原型。 InitList(*L):建立一个空的线性表L。 ListInsert(*L, i, e):在线性表L中的第i个位置插入新元素e。 ListDelete(*L, i, *e):删除线性表L中第i个位置元素,并用e返回其值。 LocateElem(L, e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。

wyh_try的博客 953

如何使用 Python 爬虫爬取滴滴打车信息:获取司机和乘客数据

滴滴打车作为中国最大的打车平台之一,提供了丰富的司机和乘客数据,包括司机的车辆信息、乘客的评价、行程数据等。公开的司机和车辆信息(如司机的名字、车辆类型、评价等)可以通过网页直接获取,而乘客的个人信息和具体行程数据通常会受到隐私保护。在滴滴打车的网页中,司机的信息可能以特定的 HTML 标签存在,例如包含司机名称、车辆类型、车辆等级等信息。我们需要分析网页的 HTML 结构,找到这些数据所在的标签。同时,对于涉及到隐私的用户数据(如乘客的行程信息、用户评价等),我们必须特别谨慎,避免侵犯他人的隐私。

2201_76125261的博客 1917

论文阅读:ICLR 2023 FINE-TUNING ALIGNED LANGUAGE MODELS COMPROMISES SAFETY, EVEN WHEN USERS DO NOT INTEND

对大型语言模型(LLMs)进行微调以适应特定用例通常涉及对预训练的LLMs进行进一步的定制。Meta公开发布Llama模型和OpenAI的API允许在自定义数据集上微调GPT-3.5 Turbo,也鼓励这种做法。但是,这种自定义微调与安全成本有何关联?我们注意到,尽管现有的安全对齐基础设施可以在推理时限制LLMs的有害行为,但它们并未涵盖将微调权限扩展到最终用户时的安全风险。我们的红队研究发现,即使是只有几个设计有敌意的训练示例进行微调,也可以破坏LLMs的安全对齐。

CSPhD-winston的博客 811

线性表概念_线性表的顺序表表示和实现_线性表的顺序存储

线性表基础概念,线性表的顺序表表示和实现 线性表 线性表(linear list)是最基本、最简单、也是最常用的一种数据结构。线性表是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。 特征 线性表是具有相同特征的数据元素的一个有限序列。 线性表(linear list)由n(n>=0)个数据元素(结点)a1,a2,…,an组成的有限序列 线性表中元素的个数n(n...

diviner_s的博客 5097

YOLOv8剪枝 lamp剪枝测试精度仅掉0.7个点,速度提高11.8fps!

该摘要介绍了LAMP剪枝方法的创新点和理论分析,重点突出了其最小化L2失真和分层自适应剪枝的特性。LAMP通过引入ξ变量在最坏情况下优化剪枝失真,并简化了计算过程。文章还提供了代码移植的具体步骤,包括创建compress.py文件和相关配置说明。

FJN110的博客 1113

C++线性表的基本操作

C++线性表的基本操作: 代码如下: #include<iostream> #include<stdlib.h> using namespace std; typedef int Elem; #define LIST_INST_SIZE 8 class List { public: List(int size);//构造函数 ~List();//析构函数,销毁 ...

weixin_43933077的博客 7115

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

线性表的插入

#include <stdio.h> #include <stdlib.h> #define MAXSIZE 20 #define OK 1 #define ERRO 0 typedef int ElemType;//元素类型重命名 typedef int Status;//状态重命名 /*创建线性表结构体 ...

qq_37422050的博客 4628

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

线性表的应用—线性表的合并

通过输入要取值的元素的位置来进行取值,并将取到的结果赋给同种变量类型e,在这里e同时也要使用引用传递,因为将取到的值赋给变量e后,e的值已经发生改变了。利用两个线性表LA和LB分别表示集合A和集合B,然后遍历线性表LB中的所有元素,将每一次遍历的元素取出,再和线性表LA中的元素逐一比较,如果线性表LA中。元素的查找要使用逐一对比,从第一个元素开始依次与传进的值e进行对比,如果相同,返回i+1,如果没有与传入元素相同的值,返回0,具体代码实现如下。线性表的展示直接利用循环,遍历输出线性表中元素的值即可。

m0_74472474的博客 1239

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

线性表的总结

一.线性表( Linear List )的定义:线性表是零个或多个具有相同类型的数据元素的有限序列。数据元素的个数定义为线性表的 长度 。长度等于零时称为空表,一个非空表通常记为 L = ( a 1 , a 2 ,……, a n ) 其中, a i ( 1 ≤ i ≤ n )称为数据元素,下标 i 表示该元素在线性表中的位置或序号, 称元素 a i 位于表的第 i 个位置,或称 a i 是表中的第...

hzcx777的博客 1282

线性表 (一) 线性表定义与线性表插入与删除

本文主要通俗地介绍了线性表的特征

qq_44639974的博客 1452

线性表代码

package 线性表和链表; //线性表 public class SqList<E> { private Object[]data;//存储数据元素 private int length;//线性表当前长度 private int maxSize;//数组长度 最大存储空间 public SqList(){ data=new Object[20]; length=0; //也可以直接使用 this(20)

梵高话葵 263

逆置线性表(线性表)

Problem A: 逆置线性表(线性表) Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 228  Solved: 118 [Submit][Status][Web Board] Description (线性表)请写一个算法将顺序存储结构的线性表(a1...an)逆置为(an...a1)。 Input 输入长度n

u013629228的专栏 3994
上一篇: 绪论
下一篇: 栈
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值