数据结构高分笔记-线性表代码

//线性表结构体定义 

//顺序表定义
typedef struct{
	int data[maxsize];
	int length;
}sqlist; 

//单链表定义
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode; 

//双链表定义 
typedef struct DLNode{
	int data;
	struct LNode *prior;
	struct LNode *next;
}DLNode; 



//顺序表
//按元素值的查找算法
int findelem(sqlist L,int e){  //查找e 
	int i;
	for(i=0;i<L.length;++i)	
		if (e==L.data[i])
			return i;
	return -1;
}

//插入元素
int insertelem(sqlist &L,int p,in e) //在L中的p位置插入元素e
{
	int i;
	if(p<0||p>L.length||L.length==maxsize)
		return 0;
	for(i=L.length-1;i>=p;--i)    
		L.data[i+1]=L.data[i]; //元素后移 
	L.data[p]=e;
	++(L.length);
	return 1;
 } 
 
 //删除元素
int deleteElem(sqlist &L, int p, int &e) //删除p位置上的元素 e得到被删除元素的值 
{	
	int i;
	if(p<0||p>L.length-1) 
		return 0;
	e=L.data[p];
	
	for(i=p;i<L.length-1;++i)
		L.data[i]=L.data[i+1];
	--(L.length);
	return 1;
} 

//归并
void mergearray(int a[],int m, int b[],int n, int c[]) {
	int i=0,j=0;
	int k=0;
	while (i<m&&j<n){
		if(a[i]<b[j])
			c[k++]=a[i++];
		else
			c[k++]=b[j++];
	}
	while(i<m)
		c[k++]=a[i++];
	while(j<n)
		c[k++]=b[j++];
	
}


//单链表的操作

//插入
s->next=p->next;
p->next=s; 
//删除
q=p->next;
p->next=p->next->next;
free(q);


//尾插法  比头插法多一个辅助指针 
void creatlistR(LNode *&head){ 
	LNode *p=NULL,*r;     //p用来增加结点    r用来辅助     
	
	head=(LNode*)malloc(sizeof(LNode));  
	head->next=NULL;           //带头结点的链表 
	r=head;
	
	int n;   
	scanf("%d",&n); 
	for(int i=0;i<n;++i){   				 
		p=(LNode*)malloc(sizeof(LNode)); 
		p->next=NULL;      //注意这里和书上的区别    因为这里=NULL了 循环结束以后不需要额外加=NULL 
		
		scanf("%d",&(p->data));
		p->next=r->next;
		r->next=p;
		r=p;
	}
}

//头插法	 结果是逆序 
void creatlistH(LNode *&head){ 
	LNode *p=NULL;//*r;  无需辅助指针 
	
	head=(LNode*)malloc(sizeof(LNode));  
	head->next=NULL;  
	r=head;
	
	int n;   
	scanf("%d",&n);
	for(int i=0;i<n;i++){   				 
		p=(LNode*)malloc(sizeof(LNode));
		p->next=NULL;
		
		scanf("%d",&(p->data));
		p->next=head->next;
		head->next=p;
	}
}

//归并算法
//尾插法归并
void merge(LNode *A,LNode *B,LNode *&C){
	LNode *p=A->next;
	LNode *q=B->next;  	//pq跟踪AB中最小值
	LNode *r;    		//尾插法需要一个辅助指针 
	//对A头结点的废物利用 
	c=A;
	c->next=NULL; 
	free(B);
 	r=c; 
	while(p!=NULL&&q!=NULL){
		if(p->data<=q->data){
			r->next=p;p=p->next;
			r=r->next;
		}else{
			r->next=q;q=q->next;
			r=r->next;
		}
	}
	r->next=NULL;		//其实可去掉
	if(p!=NULL){
		r->next=p;
	}
	if(q!=NULL){
		r->next=q;
	}
}

//头插法归并  得到逆序归并 
void mergeR(LNode *A,LNode *B,LNode *&C){
	LNode *p=A->next;
	LNode *q=B->next;  	//pq跟踪AB中最小值
	LNode *s;    		        //这里s似乎不是必要的吧 视频说是取下并入的结点  后期复习可以运行下 
	
	//对A头结点的废物利用 
	c=A;
	c->next=NULL; 
	free(B);
	
	while(p!=NULL&&q!=NULL){
		if(p->data<=q->data){
			s=p;p=p->next;
			s->next=c->next;
			c->next=s;
		}else{
			s=q;q=q->next;
			s->next=c->next;
			c->next=s;
		}
	}
	//和前面不同的地方
	while(p!=NULL){
		s=p;
		p=p->next;
		s->next=c->next;
		c-next=s;
	}
	while(q!=NULL){
		s=q;
		p=q->next;
		s->next=c->next;
		c-next=s;
	}
}



//双链表的操作

//尾插法建立双链表
void createDlistR(DLNode *&L,int a[], int n){
	DLNode *s,*r;
	L=(DLNode *)malloc(sizeof(DLNode)) ;
	L->prior=NULL;
	L->next=NULL;
	r=L;
	
	for(int i;i<n;++i) {
		s=(DLNode*)malloc(sizeof(DLNode));
		s->data=a[i];
		r->next=s;
		s->prior=r;
		r=s;
	}
	r->next=NULL;
}
//查找结点的算法
DLNode *findnode(DLNode *c,int x){  //查找第一个值为x的结点 
	DLNode *p=c->next;
	while(p!=NULL){
		if(p->data==x) 
			break;
		p=p->next;
	}
	return p;
}

//插入结点
s->next=p->next;
s->prior=p;
p->next=s;
s->next->prior=s;

//删除节点
q=p->next;
p->next=q->next;
q->next->prior=p;
free(q);
 



猜你喜欢

转载自blog.csdn.net/dreampinguo/article/details/82291321
今日推荐