寒假作业-day3
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)丢失指向动态分配内存的指针:
当一个指针指向动态分配的内存,但该指针被重新赋值或者丢失,导致无法释放这块内存,也会造成内存泄漏。