1>请编程实现双向链表的头插,头删、尾插、尾删
请编程实现双向链表按任意位置插入、删除、修改、查找
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
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;i<len;i++)
head=insert_head(head,arr[i]);
output(head);
head=delete_head(head);
output(head);
int len1=sizeof(arr)/sizeof(arr[0]);
for(int i=0;i<len1;i++)
head=insert_rear(head,arr[i]);
output(head);
head=delete_rear(head);
output(head);
int choice,pos,e;
printf("请输入操作元素:");
scanf("%d",&e);
printf("请输入操作位置:");
scanf("%d",&pos);
head=insert_pos(head,pos,e);
output(head);
head=delete_pos(head,pos);
output(head);
search_pos(head,pos);
head=change_pos(head,pos,e);
output(head);
return 0;
}
linklist create(){
linklist p=(linklist)malloc(sizeof(struct Node));
if(!p)
return NULL;
p->data=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;i<pos-1;i++)
q=q->next;
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;i<pos-1;i++)
p=p->next;
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;i<pos;i++)
p=p->next;
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;i<pos;i++)
p=p->next;
p->data=e;
return head;
}
结果展示:
1)正序输出
2)逆序输出
2>请简述栈和队列的区别
1)栈是先进后出,队列是先进先出
2)栈在一端(栈顶)实现插入和删除,队列:在两端(队头,队尾)实现插入和删除)
3>请简述什么内存泄露?
内存泄漏是指程序运行过程中申请了内存空间,但没有释放,导致这部分内存无法再被其他程序使用。
内存泄漏可能会导致程序运行时占用的内存越来越多,最终导致系统性能下降或者程序崩溃。
内存泄露有以下几种情况:
(1)忘记释放动态分配的内存:
当我们使用malloc分配内存时,需要在使用完毕后使用free来释放内存。如果忘记释放,就会造成内存泄漏。
(2)丢失指向动态分配内存的指针:
当一个指针指向动态分配的内存,但该指针被重新赋值或者丢失,导致无法释放这块内存,也会造成内存泄漏。