1. 程式人生 > >資料結構線性表之約瑟夫環&&多項式求和&&差&&積&&導數&&給變數賦值小練習

資料結構線性表之約瑟夫環&&多項式求和&&差&&積&&導數&&給變數賦值小練習

問題描述

  • 約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0~n-1,最後 [1] 結果+1即為原問題的解。

  • 數學上的一元多項式的表示是p(x) = p0 + p1 * x + p2 * x^2 + p3 * x^3 + … + pn * x^n;
    用連結串列來表示就是p = (p0, p1, p2, … , pn);
    所謂的多項式相加就是同類項的合併,也就是兩條連結串列的合併。
    採用單鏈表儲存多項式,連結串列的每個結點表示多項式的每一非零項,連結串列應該按有序排列。
    直接上原始碼

#include<stdio.h>
#include<stdlib.h>

typedef struct node{
	
	int id ;
	int psd ;
	struct node * next ;
		
}listnode,*linklist;
void init_list(linklist * h);
void input_data(int num ,linklist  h);
void out_queue(int s_key , linklist h);

int main(){
	
	int num , s_key ;
	linklist h ;
	init_list(&h);
	scanf("%d",&num);
	scanf("%d",&s_key);
	input_data(num , h);
	out_queue(s_key,h);
	return 0 ;
}

void out_queue(int s_key ,linklist h){
	
	linklist q = h ;
	linklist p = q->next ;
	s_key -- ;
	while(p != p -> next){
	
		if(p == h){
			q = p ;
			p = p->next ;
		
		}
		if(s_key == 0){
			s_key = p->psd ;
			printf("%d ",p->id);
			q->next = p->next ;
			free(p);
			p = q->next ;
			s_key -- ;
		}
		
		
		else{	
			q = p ;
			p = p->next ;
			s_key -- ;
		}
	}
	free(h);
}

void input_data(int num ,linklist h){

	linklist q , p;
	 p = h ;
	 int i = 1 ;
	while(num){
		
		q = (linklist)malloc(sizeof(listnode));
		scanf("%d",&(q->psd));
		q->id = i ;
		num -- ;
		i++ ;
		q ->next = p->next ;
		p->next = q ;
		p = q ;
	}
}

void init_list(linklist * h){
	
	linklist q ;
	* h = NULL ;
	*h = (linklist)malloc(sizeof(listnode));
	q =  *h ;
	q ->next = * h	;	
}

求和差

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
		int zhishu ;
		int xishu ;
		struct node * next ;
			
}nodelist ,* linklist;
void init_list(linklist * h);
void input_data(linklist h ,int i);
void calcu(linklist h1 ,linklist h2);
void prt(linklist h);
void destroy(linklist h);

int main(){
	
	linklist h1,h2 ;
	init_list(&h1);
	init_list(&h2);
	input_data(h1,1);
	input_data(h2,1);
	calcu(h1 ,h2);
	
	
}
//通過傳i的值來判斷是"+"或"-" 
void calcu(linklist h1 ,linklist h2){
 
	linklist h3=NULL , s ,t;
	init_list(&h3);
	t = h3 ;
	linklist p ,q ;
	p = h1 ->next ;
	q = h2 ->next ;
	while(p!=NULL && q!=NULL){
		
		s= (nodelist*)malloc(sizeof(nodelist));	
		if(p->zhishu< q->zhishu){
			
		 
			s ->xishu = p->xishu ;
			s->zhishu = p->zhishu ;
			s-> next= t->next ;
			t->next = s ;
			t = s ;
			p = p->next ;
		}
		else if(p->zhishu > q->zhishu){
			
	
			s->zhishu = q->zhishu ;
			s->xishu = q->xishu ;
			s->next = t->next ;
			t->next = s ;
			t = s ;
			q = q->next ;
		}
		else{
	
			s->xishu  = p->xishu + q->xishu ;
			s->zhishu = p->zhishu;
			if(s->xishu == 0){
				free(s);
				p = p->next ;
				q = q->next ;
				continue ;			
			}
			s->next = t->next;
			t->next = s ;
			t = s ;
			q = q->next ;
			p = p->next ;
		}
	}
	while(p != NULL){
		
		s = (linklist)malloc(sizeof(nodelist));
		s->xishu = p->xishu ;
		s->zhishu = p->zhishu ;
		s->next = t->next ;
		t ->next = s ;
		t = s ;
		p = p->next;
	}
	while(q != NULL){
	
		s = (linklist)malloc(sizeof(nodelist));
		s -> xishu= q->xishu ;
		s->zhishu = q->zhishu ;
		s->next = t->next ;
		t->next = s ;
		t = s ; 
		q = q->next ;
	}
	prt(h3);
	destroy(h3);
	destroy(h2);
	destroy(h1);	
}

void destroy(linklist h){
	
	linklist p = h ;
	h = h->next ;
	while(h != NULL){
	

		free(p);
		p = h ;
		h = h->next ;		
	}
	free(h);
	return ;
}

void prt(linklist h){
	
	if(h->next == NULL){
		printf("0");
		return ;
	}
	linklist p ;
	p = h->next ;
	while(p!= NULL){
		if(p->xishu < 0){
			
			printf("-");
			p->xishu = -p->xishu ;
		}
		printf("%d",p->xishu);
		if(p->zhishu != 0){
			printf("X");
			if(p->zhishu != 1)
				printf("^%d",p->zhishu);
		}
		p = p->next ;
		if(p == NULL)break ;
		if(p->xishu > 0){	
			printf("+");
		}
	}
}

void input_data(linklist h ,int i){
	
	linklist  p ,q ;
	p = h ;
	int num ;
	scanf("%d",&num);
	getchar();
	if(num){
	
		q = (linklist)malloc(sizeof(nodelist));
		while((scanf("(%d,%d)",&(q->xishu) ,&(q->zhishu)))!=EOF&& num){
			q->xishu*= i ;
			q->next = p->next;
			p->next = q ;
			p = q ;
			num -- ;
			if(num == 0)break ;
			q = (linklist)malloc(sizeof(nodelist));
			} 
	}
	else{
		return ;
	}
}
void init_list(linklist * h){
	
	*h = NULL ;
	*h = (linklist)malloc(sizeof(nodelist));
	(*h)->next =NULL ;
}

求積


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node{
		int zhishu ;
		int xishu ;
		struct node * next ;
			
}nodelist ,* linklist;
void init_list(linklist * h);
void input_data(linklist h ,int i);
void calcu(linklist h1 ,linklist h2);
void prt(linklist h);
void destroy(linklist h);


int main(){
	
	linklist h1,h2 ;
	init_list(&h1);
	init_list(&h2);
	input_data(h1,1);
	input_data(h2,1);
	calcu(h1 ,h2);
	return 0;
}

void calcu(linklist h1 ,linklist h2){
 
 	linklist h3,s,t ;
 	init_list(&h3);
 	memset(h3 ,0 ,sizeof(h3));
 	linklist p , q ;
 	p = h1->next ;
 	t = h3 ;
 	while(p){
 		q = h2->next ;	
 		while(q){
 			s = (linklist)malloc(sizeof(nodelist));
 			s->xishu = p->xishu*q->xishu ;
 			s->zhishu = p->zhishu+q->zhishu ;
 			if(s->xishu == 0){
 				free(s) ;
 				q = q->next ;
 				continue ;
			 }
			if(s->zhishu == t->zhishu){
				t->xishu = t->xishu + s->xishu ;
				free(s);
				q= q->next ;
				continue ;
			}
			else{
				if(t->zhishu < s->zhishu){
					s->next = t->next ;
					t->next = s ;
					t = s ;
					}
				else{
					
					t->zhishu = s->zhishu+t->zhishu ;
					s->zhishu = t->zhishu -s->zhishu ;
					t->zhishu = t->zhishu -s->zhishu ;
					t->xishu = s->xishu+t->xishu ;
					s->xishu = t->xishu - s->xishu ;
					t->xishu = t->xishu - s->xishu ;
					s->next = t->next ;
					t->next = s ;
					t = s ;
				}
				q= q->next ;
			}
		 }
 		p = p->next ;

	 }
	

	prt(h3);
	destroy(h1);
	destroy(h2);
	destroy(h3);
}

void destroy(linklist h){
	
	linklist p = h ;
	h = h->next ;
	while(h != NULL){
	

		free(p);
		p = h ;
		h = h->next ;		
	}
	free(h);
	return ;
}

void prt(linklist h){
	
	if(h->next == NULL){
		printf("0");
		return ;
	}
	linklist p ;
	p = h->next ;
	while(p!= NULL){
		if(p->xishu < 0){
			
			printf("-");
			p->xishu = -p->xishu ;
		}
		printf("%d",p->xishu);
		if(p->zhishu != 0){
			printf("X");
			if(p->zhishu != 1)
				printf("^%d",p->zhishu);
		}
		p = p->next ;
		if(p == NULL)break ;
		if(p->xishu > 0){	
			printf("+");
		}
	}
}

void input_data(linklist h ,int i){
	
	linklist  p ,q ;
	p = h ;
	int num ;
	scanf("%d",&num);
	getchar();
	if(num){
	
		q = (linklist)malloc(sizeof(nodelist));
		while((scanf("(%d,%d)",&(q->xishu) ,&(q->zhishu)))!=EOF&& num){
			q->xishu*= i ;
			q->next = p->next;
			p->next = q ;
			p = q ;
			num -- ;
			if(num == 0)break ;
			q = (linklist)malloc(sizeof(nodelist));
			} 
	}
	else{
		return ;
	}
}
void init_list(linklist * h){
	
	*h = NULL ;
	*h = (linklist)malloc(sizeof(nodelist));
	(*h)->next =NULL ;
}

取值

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef struct node{
		int zhishu ;
		int xishu ;
		struct node * next ;
			
}nodelist ,* linklist;
void init_list(linklist * h);
void input_data(linklist h);
void calcu(linklist  h);
void destroy(linklist h);
int main(){
	
	linklist h ;
	init_list(&h);
	input_data(h);
	calcu(h);
	
}
void calcu(linklist h){
	
	double sum = 0;
	int n ;
	scanf("%d",&n);
	linklist p ;
	p = h->next ;
	while(p){
		
		sum += (p->xishu)*pow(n,(p->zhishu)); 
		p = p->next ;
	}
	printf("%.0lf",sum);
	destroy(h);
}

void destroy(linklist h){
	
	linklist p = h ;
	h = h->next ;
	while(h != NULL){
	

		free(p);
		p = h ;
		h = h->next ;		
	}
	free(h);
	return ;
}

void input_data(linklist h){
	
	linklist  p ,q ;
	p = h ;
	int num ;
	scanf("%d",&num);
	getchar();
	if(num){
	
		q = (linklist)malloc(sizeof(nodelist));
		while((scanf("(%d,%d)",&(q->xishu) ,&(q->zhishu)))!=EOF&& num){
			
		
			q->next = p->next;
			p->next = q ;
			p = q ;
			num -- ;
			if(num == 0)break ;
			q = (linklist)malloc(sizeof(nodelist));
		
			} 
	}
	else{
		return ;
	}

}

void init_list(linklist * h){
	
	*h = NULL ;
	*h = (linklist)malloc(sizeof(nodelist));
	(*h)->next =NULL ;
}

導數

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef struct node{
		int zhishu ;
		int xishu ;
		struct node * next ;
			
}nodelist ,* linklist;
void init_list(linklist * h);
void input_data(linklist h);
void calcu(linklist  h);
void prt(linklist h);
void destroy(linklist h);
int main(){
	
	linklist h ;
	init_list(&h);
	input_data(h);
	calcu(h);
	
}
void calcu(linklist h){
	
	linklist p ,tmp ;
	tmp = h ;
	p = tmp->next ;
	while(p){
		
		p->xishu = p->xishu * p->zhishu ;
		p->zhishu = p->zhishu -1 ;
		if(p->xishu == 0){
			tmp->next = p->next ;
			free(p);
			p = tmp->next ; 
			continue ;
		}
		tmp = p ;
		p = p->next ;
	}
	prt(h);
	destroy(h);
}

void prt(linklist h){
	

	linklist p;
	p = h->next;
	while(p!= NULL){
		if(p->xishu < 0){
			
			printf("-");
			p->xishu = -p->xishu ;
		}
		printf("%d",p->xishu);
		if(p->zhishu != 0){
			printf("X");
			if(p->zhishu != 1)
				printf("^%d",p->zhishu);
		}
		p = p->next ;
		if(p == NULL)break ;
		if(p->xishu > 0){	
			printf("+");
		}
	}
}

void destroy(linklist h){
	
	linklist p = h ;
	h = h->next ;
	while(h != NULL){
	

		free(p);
		p = h ;
		h = h->next ;		
	}
	free(h);
	return ;
}

void input_data(linklist h){
	
	linklist  p ,q ;
	p = h ;
	int num ;
	scanf("%d",&num);
	getchar();
	if(num){
	
		q = (linklist)malloc(sizeof(nodelist));
		while((scanf("(%d,%d)",&(q->xishu) ,&(q->zhishu)))!=EOF&& num){
			
		
			q->next = p->next;
			p->next = q ;
			p = q ;
			num -- ;
			if(num == 0)break ;
			q = (linklist)malloc(sizeof(nodelist));
		
			} 
	}
	else{
		return ;
	}

}

void init_list(linklist * h){
	
	*h = NULL ;
	*h = (linklist)malloc(sizeof(nodelist));
	(*h)->next =NULL ;
}