2.2作业

1.堆区和栈区的区别
   堆区基于队列的思想,先定义的变量先申请内存,大小在几G,属于静态分配需要手动申请手动释放,从小地址到大地址,容易出现片段化

   栈借助栈的思想,先定义的变量,后分配内存,动态自动申请自动释放,大小在几M,会发生堆栈溢出,内存连续

2.

#include
#include
#include
typedef struct list
{
	int data;
	struct list *next;
}*Linklist;
//创建
Linklist creat()
{
	Linklist s=(Linklist)malloc(sizeof(struct list));
	if(NULL==s)
		return NULL;
	s->data=0;
	s->next=NULL;
	return s;
}
//头结点插入
Linklist insere_element(Linklist head,int  element)
{
	Linklist s=creat();
	s->data=element;
	if(NULL==head)
	{
		head=s;
	}
	else
	{
		s->next=head;
		head=s;
	}
	return head;
}
//输出
void output(Linklist head)
{
	//判断链表是否为空,为空则无法输出
	if(NULL==head)
	{
		puts("NULL");
		return;
	}
	//不为空
	Linklist p=head;
	while(p!=NULL)
	{
		printf("%-5d",p->data);
		p=p->next;
	}
	printf("\n");
}
//计算长度
int Linklist_len(Linklist head)
{
	int len=0;
	Linklist p=head;
	while(p)
	{
		len++;
		p=p->next;
	}
	return len;
}
//删除重复元素
Linklist del(Linklist head,int x)
{
	if(NULL==head)
		return head;
		Linklist p=head;
		if(head->data==x)
		{
			Linklist p=head;
			free(p);
			p=NULL;
		}
		while(p)
		{
			if(p->next->data==x)
			{
				Linklist del=p->next;
				p->next=del->next;
				free(del);
				del=NULL;
			}
			p=p->next;
		}
	return head;
	}
int main(int argc, const char *argv[])
{
	int n,element;
	scanf("%d",&n);
	Linklist head=NULL;
	for(int i=1;i<=n;i++)
	{
		printf("please input %d num:",i);
		scanf("%d",&element);
		head=insere_element(head,element);
	}
	int x;
	scanf("%d",&x);
	head=del(head,x);
	output(head);
	int length=Linklist_len(head);
	printf("%d",length);
	return 0;
}

2.2作业_第1张图片

3.单链表的头插、头删、尾插、尾删

#include
#include
#include
typedef struct list
{
	int data;
	struct list *next;
}*Linklist;
//创建
Linklist creat()
{
	Linklist s=(Linklist)malloc(sizeof(struct list));
	if(NULL==s)
		return NULL;
	s->data=0;
	s->next=NULL;
	return s;
}
//头插入
Linklist insere_element(Linklist head,int element)
{
	Linklist s=creat();
	s->data=element;
	if(NULL==head)
	{
		head=s;
	}
	else
	{
		s->next=head;
		head=s;
	}
	return head;
}
//输出
void output(Linklist head)
{
	//判断链表是否为空,为空则无法输出
	if(NULL==head)
	{
		puts("NULL");
		return;
	}
	//不为空
	Linklist p=head;
	while(p!=NULL)
	{
		printf("%-5d",p->data);
		}
		p=p->next;
	}
	printf("\n");
}
//尾插
Linklist insert_rear(Linklist head,int  element)
{
	//先创建一个结点
	Linklist s=creat();
	s->data=element;
	//判断是否为空
	if(head==NULL)
	{
		head=s;
	}
	else
	//有多个节点的情况
	{
		Linklist p=head;
		while(p->next)
		{
			p=p->next;
		}
		p->next=s;
	}
	return head;
}
//头删
Linklist head_del(Linklist head)
{
	if(head==NULL)
		return NULL;
	Linklist p=head;
	head=head->next;
	free(p);
	p=NULL;
	return head;
}
//尾删
Linklist rear_del(Linklist head)
{
	Linklist del=NULL;
	if(NULL==head)
		return head;
	else if(head->next==NULL)
	{
		free(head);
		head==NULL;
	}
	else
	{
		del=head;
		while(del->next->next)
		{
			del=del->next;
		}
		free(del->next);
		del->next=NULL;
	return head;
}
}
int main(int argc, const char *argv[])
{
	int n;
	scanf("%d",&n);
	int element;
	Linklist head=NULL;
	for(int i=1;i<=n;i++)
	{
		printf("%d num:",i);
		scanf("%d",&element);
		head=insere_element(head,element);
	//	head=insert_rear(head,element);
	}
	puts("head insert:");
	output(head);
//	puts("rear insert:");
//	output(head);
	puts("head del:");
	head_del(head);
	output(head);
//	puts("rear del:");
//	head_del(head);
//	output(head);
	return 0;
}

你可能感兴趣的:(算法,数据结构)