双向链表的功能实现
头插
void insert_head(node_p H,datatype data){
if(H==NULL){
printf("入参为空\n");
return -1;
}
node_p new=create_node(data);
if(H->data==0){
node_p new=create_node(data);
new->next=H->next;
new->prior=H;
H->next=new;
H->data++;
}else{
node_p new=create_node(data);
new->next=H->next;
new->prior=H;
H->next->prior=new;
H->next=new;
H->data++;
}
}
头删
void Delete_head(node_p H){
if(H==NULL){
printf("入参为空\n");
return -1;
}
if(empty_double(H)){
printf("链表为空,不能删除\n");
return;
}
if(H->data==1){
node_p del=H->next;
H->next=del->next;
free(del);
H->data--;
}else{
node_p del=H->next;
H->next=del->next;
del->next->prior=H;
H->data--;
}
}
尾插
void Insert_tail(node_p H,datatype data){
if(H==NULL){
printf("入参为空\n");
return -1;
}
node_p p=H;
while(p->next){
p=p->next;
}
node_p new=create_node(data);
new->prior=p;
new->next=p->next;
p->next=new;
H->data++;
}
尾删
void Delete_tail(node_p H){
if(H==NULL){
printf("入参为空\n");
return -1;
}
if(empty_double(H)){
printf("链表为空,不能删除\n");
return;
}
node_p p=H->next;
node_p q=H;
while(p->next){
p=p->next;
q=q->next;
}
node_p del=p;
q->next=del->next;
free(del);
H->data--;
}
按位置插
void insert_index(node_p H,datatype data,datatype index){
if(H==NULL){
printf("入参为空\n");
return -1;
}
node_p p=H;
for(int i=0;i<index-1;i++){
p=p->next;
}
node_p new=create_node(data);
new->next=p->next;
new->prior=p;
p->next->prior=new;
p->next=new;
H->data++;
}
按位置删
void Delete_index(node_p H,datatype index){
if(H==NULL){
printf("入参为空\n");
return -1;
}
if(empty_double(H)){
printf("链表为空,不能删除\n");
return;
}
node_p p=H;
for(int i=0;i<index-1;i++){
p=p->next;
}
node_p del=p->next;
if(H->data==1){
p->next=del->next;
free(del);
H->data--;
}else{
del->next->prior=p;
p->next=del->next;
free(del);
H->data--;
}
}
双向链表源码
double_list.c
#include "double_list.h"
node_p create_list(){
node_p H=(node_p)malloc(sizeof(node));
if(H==NULL){
printf("空间申请失败\n");
return NULL;
}
H->data=0;
H->prior=NULL;
H->next=NULL;
return H;
}
node_p create_node(datatype data){
node_p new=(node_p)malloc(sizeof(node));
if(new==NULL){
printf("空间申请失败\n");
return NULL;
}
new->data=data;
return new;
}
int empty_double(node_p H){
if(H==NULL){
printf("入参为空\n");
return -1;
}
return H->next==NULL?1:0;
}
void insert_head(node_p H,datatype data){
if(H==NULL){
printf("入参为空\n");
return -1;
}
node_p new=create_node(data);
if(H->data==0){
node_p new=create_node(data);
new->next=H->next;
new->prior=H;
H->next=new;
H->data++;
}else{
node_p new=create_node(data);
new->next=H->next;
new->prior=H;
H->next->prior=new;
H->next=new;
H->data++;
}
}
void show_double(node_p H){
if(H==NULL){
printf("入参为空\n");
return -1;
}
if(empty_double(H)){
printf("链表为空,不能输出\n");
return;
}
node_p p=H;
while(p->next){
p=p->next;
printf("%-4d",p->data);
}
putchar(10);
}
void Delete_head(node_p H){
if(H==NULL){
printf("入参为空\n");
return -1;
}
if(empty_double(H)){
printf("链表为空,不能删除\n");
return;
}
if(H->data==1){
node_p del=H->next;
H->next=del->next;
free(del);
H->data--;
}else{
node_p del=H->next;
H->next=del->next;
del->next->prior=H;
H->data--;
}
}
void Insert_tail(node_p H,datatype data){
if(H==NULL){
printf("入参为空\n");
return -1;
}
node_p p=H;
while(p->next){
p=p->next;
}
node_p new=create_node(data);
new->prior=p;
new->next=p->next;
p->next=new;
H->data++;
}
void Delete_tail(node_p H){
if(H==NULL){
printf("入参为空\n");
return -1;
}
if(empty_double(H)){
printf("链表为空,不能删除\n");
return;
}
node_p p=H->next;
node_p q=H;
while(p->next){
p=p->next;
q=q->next;
}
node_p del=p;
q->next=del->next;
free(del);
H->data--;
}
void insert_index(node_p H,datatype data,datatype index){
if(H==NULL){
printf("入参为空\n");
return -1;
}
node_p p=H;
for(int i=0;i<index-1;i++){
p=p->next;
}
node_p new=create_node(data);
new->next=p->next;
new->prior=p;
p->next->prior=new;
p->next=new;
H->data++;
}
void Delete_index(node_p H,datatype index){
if(H==NULL){
printf("入参为空\n");
return -1;
}
if(empty_double(H)){
printf("链表为空,不能删除\n");
return;
}
node_p p=H;
for(int i=0;i<index-1;i++){
p=p->next;
}
node_p del=p->next;
if(H->data==1){
p->next=del->next;
free(del);
H->data--;
}else{
del->next->prior=p;
p->next=del->next;
free(del);
H->data--;
}
}
main.c
#include "double_list.h"
int main(){
node_p H=create_list();
insert_head(H,155);
insert_head(H,14);
insert_head(H,13);
insert_head(H,12);
insert_head(H,11);
show_double(H);
Delete_head(H);
Insert_tail(H,16);
Delete_tail(H);
insert_index(H,66,2);
insert_index(H,65,3);
insert_index(H,64,1);
show_double(H);
Delete_index(H,4);
show_double(H);
return 0;
}
double_list.h
#ifndef __DOUBLE_LIST_H__
#define __DOUBLE_LIST_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node{
datatype data;
struct node* prior;
struct node* next;
}node,*node_p;
node_p create_list();
node_p create_node(datatype data);
int empty_double(node_p H);
void insert_head(node_p H,datatype data);
void show_double(node_p H);
void Delete_head(node_p H);
void Insert_tail(node_p H,datatype data);
void dele_tail(node_p H);
void insert_index(node_p H,datatype data,datatype index);
void Delete_index(node_p H,datatype index);
#endif
链表逆置
void reverse_list(node_p H){
if(H==NULL){
printf("入参为空\n");
return;
}
if(empty_link(H)){
printf("链表为空,无法反转\n");
return;
}
int count=0;
node_p p=H->next;
node_p q=H;
while(p->next){//查找到最后一个元素
p=p->next;//p指向最后一个元素
q=q->next;//q指向倒数第二个元素,用于指空
}
node_p del=p;//准备删除
node_p new=create_node(p->data);//创建一个新的节点加入到头结点后面,值为p的值
new->next=H->next;//将新创建的节点头插
H->next=new;
q->next=NULL;//倒数第二个节点的next指空
free(del);//释放del指向的最后一个节点
//以上代码完成了将最后一个元素移动至头结点后
//因为后面的代码不需要和头结点进行交互所以
//需要分段
node_p new1;
for(int i=0;i<H->data-2;i++){
if(i==0){
new1=new;
}
node_p p=new1->next;
node_p q=new1;
node_p count=new1;
while(p->next){//查找到最后一个元素
p=p->next;
q=q->next;
}
node_p del=p;
new1=create_node(p->data);
new1->next=count->next;
count->next=new1;
q->next=NULL;
free(del);
}
/*node_p p = H->next->next;
H->next->next = NULL; //给第一个结点的指针域赋值为NULL,变成最后一个结点
node_p q; //暂时是一个野指针
while(p)
{
q = p->next; //在头插之前保留下一个要头插结点的首地址
p->next = H->next; //头插
H->next = p;
p = q; //让p指向下一个要头插的结点
}
*/
}