寒假作业-day3

1>请编程实现双向链表的头插,头删、尾插、尾删

    请编程实现双向链表按任意位置插入、删除、修改、查找

代码:

#include
#include
#include

typedef int datatype;
typedef struct Node{
	datatype data;
	struct Node *next;
	struct Node *prev;
}*linklist;

linklist create();
void output(linklist head);
linklist insert_head(linklist head,datatype e);
linklist delete_head(linklist head);
linklist insert_rear(linklist head,datatype e);
linklist delete_rear(linklist head);

linklist insert_pos(linklist head,int pos,datatype e);
linklist delete_pos(linklist head,int pos);
void search_pos(linklist head,int pos);
linklist change_pos(linklist head,int pos,datatype e);

int main(int argc,const char *argv[]){
	linklist head=NULL;
	int arr[]={11,22,33,44,55};
	int len=sizeof(arr)/sizeof(arr[0]);
	for(int i=0;idata=0;
	p->next=NULL;
	p->prev=NULL;
	return p;
}
void output(linklist head){
	linklist p=head;
	if(!head)
		return;
//	while(p->next)
//		p=p->next;
	while(p){
		printf("%d\t",p->data);
//		p=p->prev;
		p=p->next;
	}
	puts("");
}
linklist insert_head(linklist head,datatype e){
	linklist p=create();
	p->data=e;
	if(!head){
		head=p;
		return head;
	}
	p->next=head;
	head->prev=p;
	head=p;
	head->prev=NULL;
	return head;
}

linklist delete_head(linklist head){
	if(!head)
		return head;
	if(!head->next){
		free(head);
		head=NULL;
		return head;
	}
	linklist p=head;
	head=head->next;
	free(p);
	p=NULL;
	head->prev=NULL;
	return head;
}
linklist insert_rear(linklist head,datatype e){
	linklist p=create();
	p->data=e;
	if(!head)
		return head;
	linklist q=head;
	while(q->next)
		q=q->next;
	q->next=p;
	p->prev=q;
	return head;
}
linklist delete_rear(linklist head){
	if(!head)
		return head;
	if(!head->next){
		free(head);
		head=NULL;
		return head;
	}
	linklist p=head;
	while(p->next->next)
		p=p->next;
	linklist q=p->next;
	p->next=NULL;
	free(q);
	q=NULL;
	return head;
}
int length(linklist head){
	int len;
	linklist p=head;
	while(p){
		len++;
		p=p->next;
	}
	return len;
}
linklist insert_pos(linklist head,int pos,datatype e){
	if(pos<0||pos>length(head)){
		puts("error");
		return head;
	}
	linklist p=create();
	p->data=e;
	linklist q=head;
	if(pos==0)
		return insert_head(head,e);
	else if(pos==length(head))
		return insert_rear(head,e);
	else{
		for(int i=0;inext;
		p->next=q->next;
		q->next->prev=p;
		q->next=p;
		p->prev=q;
		
		
		return head;
	}
}
linklist delete_pos(linklist head,int pos){
	if(pos<0||pos>=length(head)){
		puts("error");
		return head;
	}
	if(!head||!head->next||pos==0)
		return delete_head(head);
	else if(pos==length(head)-1)
		return delete_rear(head);
	else{
		linklist p=head;
		for(int i=0;inext;
		linklist q=p->next;
		p->next=q->next;
		q->next->prev=p;
		free(q);
		q=NULL;
		return head;
		}
}

void search_pos(linklist head,int pos){
	if(pos<0||pos>=length(head))
		return;
	linklist p=head;
	for(int i=0;inext;
	printf("查找元素为:%d\n",p->data);
}
linklist change_pos(linklist head,int pos,datatype e){
        if(pos<0||pos>=length(head))
                return head;
        linklist p=head;
        for(int i=0;inext;
	p->data=e;
	return head;
}

结果展示:

1)正序输出

寒假作业-day3_第1张图片

2)逆序输出

寒假作业-day3_第2张图片

2>请简述栈和队列的区别

1)栈是先进后出,队列是先进先出

2)栈在一端(栈顶)实现插入和删除,队列:在两端(队头,队尾)实现插入和删除)

3>请简述什么内存泄露?

        内存泄漏是指程序运行过程中申请了内存空间,但没有释放,导致这部分内存无法再被其他程序使用。

        内存泄漏可能会导致程序运行时占用的内存越来越多,最终导致系统性能下降或者程序崩溃。

内存泄露有以下几种情况:

(1)忘记释放动态分配的内存:

        当我们使用malloc分配内存时,需要在使用完毕后使用free来释放内存。如果忘记释放,就会造成内存泄漏。

(2)丢失指向动态分配内存的指针:

        当一个指针指向动态分配的内存,但该指针被重新赋值或者丢失,导致无法释放这块内存,也会造成内存泄漏。

你可能感兴趣的:(java,算法,开发语言)