作业2024/2/4

本文详细介绍了C语言中双向链表的创建、插入、删除及查找操作,同时简要讨论了栈和队列的区别,包括内存管理机制和使用场景的不同。
摘要由CSDN通过智能技术生成
1.双向链表的头插,头删、尾插、尾删
2.双向链表按任意位置插入、删除、修改、查找

test.c

#include "head.h"
 
//创建
Doublelink create()
{
	Doublelink s=(Doublelink)malloc(sizeof(struct Node));
	if(s==NULL)
		return NULL;
 
	s->data=0;
	s->next=s->prev=s;
	return s;	
 
	
 
}
 
//头插
Doublelink insert_head(Doublelink head,datatype element)
{
	Doublelink s=create();
	s->data=element;
 
	if(NULL==head)
		head=s;
	
	else 
	{
	Doublelink rear=head->prev;
	s->next=head;
	head->prev=s;
	head=s;
	head->prev=rear;
	rear->next=head;
	}
	return head;
}
 
//循环输出
Doublelink output(Doublelink head)
{
	if(NULL == head)
	{
		puts("empty");
		return head;
	}
 
	else
	{
	Doublelink p=head;
	while(p->next!=head)
	{
	printf("%-5c",p->data);
	p=p->next;
	}
	printf("%-5c\n",p->data);
 
 
 
	do
	{
	printf("%-5c",p->data);
	p=p->prev;
	}while(p!=head->prev);
	puts("");
	}
 
}
//尾部插入
Doublelink insert_rear(Doublelink head,datatype element)
{
	Doublelink s=create();
	s->data=element;
 
	if(NULL==head)
		head=s;
	
 
	else
	{
 
	Doublelink p=head->prev;
	p->next=s;
	s->prev=p;
	s->next=head;
	head->prev=s;
	}
	return head;	
}
 
//头删
Doublelink delete_head(Doublelink head)
{
	if(head==NULL)
		return head;
	if(head->next==head)
	{
	free(head);
	head=NULL;
	return head;
	}
	
	
	Doublelink rear=head->prev;
	Doublelink del=head;
	head=head->next;
	head->prev=rear;
	rear->next=head;
	free(del);
	del=NULL;
	return head;
	
 
}
 
//尾删
Doublelink delete_rear(Doublelink head)
{
	if(head==NULL)
		return head;
	 if(head->next==head)
	{
	free(head);
	head=NULL;
	return head;
	}
	else
	{
		Doublelink p=head->prev;
						
		p->prev->next=head;
		head->prev=p->prev;
		free(p);
			p=NULL;
	return head;
	}
 
}
//定义双向链表长度位置的函数
int length_Doublelink(Doublelink  head)
{
	int len=0;
	Doublelink p=head;
	while(p->next!=head)
	{
	len++;
	p=p->next;
	}
	return len+1;
}
//定义按照所给的元素查找位置
int find_key(Doublelink head,int key)
{
	if(head==NULL)
		return 0;
 
	int len=length_Doublelink(head);
	Doublelink p=head;
	for(int i=1;i<=len;i++)
	{
		if(p->data==key)
		{
			printf("position(%d)=key\n",i);
			//return i;
		}
		p=p->next;
	}
 
}
 
 
//双向链表按任意位置插入
Doublelink insert_pos_element(Doublelink head,int pos,datatype element)
{
	if(pos<1||pos>length_Doublelink(head)+1)
	{
		puts("position ERROR");
		return head;
	}
 
 
	Doublelink s=create();
	s->data=element;
 
 
 
	if(pos==1)
	{
	head=insert_head(head,element);
	return head;
	}
 
	Doublelink p=head;
	for(int i=1;i<pos-1;i++)//i<pos-1表示一个过程让p和pos-1位置一样;
	{
		p=p->next;
	}
	s->prev=p;
	s->next=p->next;
 
	p->next->prev=s;
	p->next=s;
 
	return head;
}
 
 
 
 
//双向链表按照任意位置删除
Doublelink delete_pos(Doublelink head,int pos)
{
	if(pos<1||pos>length_Doublelink(head))
	{
		puts("ERROR");
	}
	if(head==NULL)//链表为空返回null
		{
		 return head;
		}
	if(pos==1)
	{
		delete_head;
		return head;
	}
 
	Doublelink p=head;
	for(int i=1;i<pos-1;i++)
	{
		p=p->next;
	}
 
	Doublelink del=p->next;
	p->next=del->next;
	del->next->prev=p;
	free(del);
	del=NULL;
	return head;
 
}

head.h

#ifndef _HEAD_H_
#define _HEAD_H_
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//
//定义双向链表
typedef char datatype;
 
typedef struct Node
{
	datatype data;//定义存储元素
	struct Node *next;//定义下一个节点地址
	struct Node *prev;//定义上一个节点地址
}*Doublelink;
 
 
 
Doublelink insert_head(Doublelink head,datatype element);
 
Doublelink output(Doublelink head);
 
Doublelink insert_rear(Doublelink head,datatype element);
 
Doublelink delete_head(Doublelink head);
 
Doublelink delete_rear(Doublelink head);
 
int  length_Doublelink(Doublelink head);//计算双向链表长度的函数
 
int find_key(Doublelink head,int key);//输入位元素查找到相同元素的位置
 
Doublelink insert_pos_element(Doublelink head,int pos,datatype element);
 
Doublelink delete_pos(Doublelink head,int pos);
#endif
 

main.c


#include "head.h"
 
int main(int argc, const char *argv[])
{
	Doublelink head=NULL;
	int n;
	datatype element;
	printf("please enter n:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	printf("please enter %d element:",i+1);
 
	scanf(" %c",&element);
//	head=insert_head(head,element);//头插
	head=insert_rear(head,element);//尾插
	}
//	head=delete_head(head);
//	head=delete_rear(head);
//
//
//
//
//	int len=length_Doublelink(head);//计算双向链表位置长度
//	printf("%d\n",len);
//
//
//
 
 
 
/*	
	datatype key;//按照元素查找位置
	printf("key=:");
	scanf(" %c",&key);
	find_key(head,key);
*/	
	
	
/*	
	output(head);
	datatype element;
	printf("please enter element you want");
	scanf(" %c",&element);
	int pos;
	printf("please enter pos you want");
	scanf("%d",&pos);
	insert_pos(head,pos,element);
*/
 
 
/*	output(head);按照任意位置删除
	int pos;
	printf("please enter element you want:");
	scanf(" %c",&element);
	printf("please enter pos you want insert:");
	scanf("%d",&pos);
	head=insert_pos_element(head,pos,element);
	output(head);*/
 
	output(head);
	int pos;
	printf("please enter pos you want delete:");
	scanf("%d",&pos);
	head=delete_pos(head,pos);
	output(head);
	
	
 
	return 0;
}

3.请简述栈和队列的区别? 

(1)栈区借助于栈的思想实现,先进后出:先定义变量,后分配内存,栈区的地址申请从大地址到小地址,堆区借助于队列的思想实现,先进先出:定义变量后,同时分配内存,栈区的地址申请从小地址到大地址。

        (2)栈区的内存由计算机自动分配自动释放,堆区的内存由计程序员手动分配手动释放。

        (3)栈区的大小一般在几M,堆区的大小一般在几G。

        (4)栈区内存申请一般比较连续,堆区内存容易出现片段化,类似于链表,从第一个空内存进行比较,如果查到合适大小,则申请给变量,把空内存删除。

        (5)堆栈溢出:表示栈区内存不足,例如递归,当递归调用到深处时,计算机需要不断在栈申请内存。

4.内存泄露

申请内存指针不指向堆区首地址。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值