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.内存泄露
申请内存指针不指向堆区首地址。