22、数据结构/双向链表相关练习

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

运行结果:

22、数据结构/双向链表相关练习_第1张图片22、数据结构/双向链表相关练习_第2张图片

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

运行结果:

22、数据结构/双向链表相关练习_第3张图片22、数据结构/双向链表相关练习_第4张图片22、数据结构/双向链表相关练习_第5张图片22、数据结构/双向链表相关练习_第6张图片

代码:

#include
#include
#include
typedef int datatype;
typedef struct Node//定义双向链表的节点结构体
{
	datatype data;//数据域
	struct Node *prev;//指针域 指向上个节点
	struct Node *next;//指针域 指向下个节点
}*doublelink;
doublelink create_node()
{
	doublelink s=(doublelink)malloc(sizeof(struct Node));
	if(NULL==s)
		return NULL;
	s->data=0;
	s->prev=NULL;
	s->next=NULL;
	return s;
}
doublelink insert_head(doublelink head,datatype element)
{
	doublelink s=create_node();
	if(NULL==s)
	{
		puts("create_node fail");
		return NULL;
	}
	s->data=element;
	if(head==NULL)
	{
		head=s;
		return head;
	}
	s->next=head;
	head->prev=head;
	head=s;
	return head;
}
doublelink insert_rear(doublelink head,datatype element)
{
	doublelink s=create_node();
	if(NULL==s)
	{
		puts("create_node fail");
		return NULL;
	}
	s->data=element;
	if(NULL==head)
	{
		head=s;
		return head;
	}
	doublelink p=head;
	while(p->next)
		p=p->next;
	p->next=s;
	s->prev=p;
	return head;
}
doublelink delete_head(doublelink head)
{
	if(head==NULL)
	{
		puts("empty");
		return NULL;
	}
	if(NULL==head->next)
	{
		free(head);
		return NULL;
	}
	doublelink del=head;
	head=head->next;
	head->prev=NULL;
	free(del);del=NULL;
	return head;
}
doublelink delete_rear(doublelink head)
{	
	if(head==NULL)
	{
		puts("empty");
		return NULL;
	}
	if(NULL==head->next)
	{
		free(head);
		return NULL;
	}
	doublelink p=head;
	while(p->next->next)
		p=p->next;
	doublelink del=p->next;
	p->next=NULL;
	free(del);del=NULL;
	return head;
}
int lengh(doublelink head)
{
	int l=0;
	while(head)
	{
		l++;
		head=head->next;
	}
	return l;
}
doublelink insert_index(doublelink head,int index,datatype element)
{
	int l=lengh(head);
	if(NULL==head || index<1 || index>l+1)
	{
		puts("empty or index error");
		return head;
	}
	if(1==index)
	{
		head=insert_head(head,element);
		return head;
	}
	if(l+1==index)
	{
		head=insert_rear(head,element);
		return head;
	}
	doublelink s=create_node();
	s->data=element;
	doublelink p=head;
	for(int i=1;inext;
	s->next=p->next;
	s->prev=p;
	p->next->prev=s;
	p->next=s;
	return head;
}
doublelink delete_index(doublelink head,int index)
{
	if(NULL==head || index<1 || index>lengh(head))
	{
		puts("empty or index error");
		return head;
	}
	if(1==index)
	{
		head=delete_head(head);
		return head;
	}
	if(index==lengh(head))
	{
		head=delete_rear(head);
		return head;
	}
	doublelink p=head;
	for(int i=1;inext;
	doublelink del=p->next;
	p->next=del->next;
	del->next->prev=p;
	free(del);del=NULL;
	return head;
}
void chg_index(doublelink head,int index,datatype element)
{	
	if(NULL==head || index<1 || index>lengh(head))
	{
		puts("empty or index error");
		return;
	}
	doublelink p=head;
	for(int i=1;inext;
	p->data=element;
}
void search_index(doublelink head,int index)
{	
	if(NULL==head || index<1 || index>lengh(head))
	{
		puts("empty or index error");
		return;
	}
	doublelink p=head;
	for(int i=1;inext;
	printf("search_index is: %d\n",p->data);
}
void output(doublelink head)
{
	while(head)
	{
		printf("%-4d",head->data);
		head=head->next;
	}
	puts("");
}
int main(int argc, const char *argv[])
{
	doublelink head=NULL;
	int len;
	printf("please enter the lengh of the doublelink:");
	scanf("%d",&len);
	datatype element;
	for(int i=0;i

三、请简述栈和队列的区别?

1.栈是只允许栈顶插入和删除的操作受限的线性表(先进后出);

2.队列是只允许在队尾插入、队头删除的线性表(先进先出);

四、请简述什么内存泄露?

内存泄漏指在堆区申请内存后,释放内存时传入free()的地址不是申请的那块内存的首地址,这样会导致传入free()的地址之前的那部分内存没有被释放,造成内存空间泄露。

你可能感兴趣的:(数据结构,链表)