main函数部分:
#include <stdio.h>
#include "./23_doubleLinkList.h"
int main(int argc, const char *argv[])
{ doubleLinkList* head = create_doubleLinkList();insertHead_doubleLinkList(head,12);insertHead_doubleLinkList(head,21);insertHead_doubleLinkList(head,14);insertHead_doubleLinkList(head,16);insertTail_doubleLinkList(head,13);show_doubleLinkList(head);insertBypos_doubleLinkList(head,33,6);show_doubleLinkList(head);deleteHead_doubleLinkList(head);show_doubleLinkList(head);deleteTail_doubleLinkList(head);show_doubleLinkList(head);deleteBypos_doubleLinkList(head,2);show_doubleLinkList(head); return 0;
}
功能函数:
#include<stdio.h>
#include <stdlib.h>
#include "./23_doubleLinkList.h"
doubleLinkList* create_doubleLinkList()
{ doubleLinkList* head = (doubleLinkList*)malloc(sizeof(doubleLinkList)); if(NULL==head) { printf("头结点创建失败!\n"); return NULL; } head->text.len=0; head->next=head->prev=NULL; return head;
}
//判断链表是否为空
int isEmpty(doubleLinkList* head)
{ return head->next==NULL?1:0;
}
//头插
void insertHead_doubleLinkList(doubleLinkList* head,datatype num)
{ doubleLinkList* temp=(doubleLinkList*)malloc(sizeof(doubleLinkList)); if(NULL == temp) { printf("头结点创建失败!\n"); return; } temp->text.data=num; temp->next=temp->prev=NULL; //插入操作 //需分情况考虑该链表是否有元素,以免出现段错误 if(head->next!=NULL) { temp->next = head->next; head->next=temp; temp->prev=head; temp->next->prev=temp; }else { temp->next = head->next; head->next=temp; temp->prev=head; } head->text.len++; return; }
//尾插
void insertTail_doubleLinkList(doubleLinkList* head,datatype num)
{ //定义一个新的结点 doubleLinkList* temp=(doubleLinkList*)malloc(sizeof(doubleLinkList)); if(NULL == temp) { printf("头结点创建失败!\n"); return; } temp->text.data=num; temp->next=temp->prev=NULL; //找到尾部的结点,p就是原双向链表的尾部结点 doubleLinkList* p=head; while(p->next!=NULL) { p=p->next; } p->next=temp; temp->next=NULL; temp->prev=p; head->text.len++; return;
}
//按位置插入
void insertBypos_doubleLinkList(doubleLinkList* head,datatype num,int pos)
{ if(pos<1 || pos>head->text.len+1) { printf("输入的位置%d不合法!\n",pos); } //定义一个新的结点 doubleLinkList* temp=(doubleLinkList*)malloc(sizeof(doubleLinkList)); if(NULL == temp) { printf("头结点创建失败!\n"); return; } temp->text.data=num; temp->next=temp->prev=NULL; //找到要插入位置的前一个`结点 doubleLinkList* p=head; int i; for(i=0;i<pos-1;i++) { p=p->next; } temp->next=p->next; p->next=temp; temp->prev=p; if(temp->next!=NULL) temp->next->prev=temp; head->text.len++; return;
}
//头删
void deleteHead_doubleLinkList(doubleLinkList* head)
{ if(head->next==NULL) { printf("链表为空!\n"); return; } //定义一个指针指向要删除的结点方便后续释放 doubleLinkList* temp; temp=head->next; head->next=temp->next; //需分情况考虑该结点是否为链表最后一个结点,以免出现段错误 if(temp->next!=NULL) { temp->next->prev=head; } free(temp); head->text.len--; return;
}
//尾删
void deleteTail_doubleLinkList(doubleLinkList* head)
{ if(head->next==NULL) { printf("链表为空!\n"); return; } //定义一个指针指向要删除的结点方便后续释放 doubleLinkList* p=head; while(p->next!=NULL) { p=p->next; } p->prev->next=NULL; free(p); head->text.len--; return; }
//按位置删除
void deleteBypos_doubleLinkList(doubleLinkList* head,int pos)
{ if(head->next==NULL) { printf("链表为空!\n"); return; } //判断位置是否合法 if(pos<1 || pos>head->text.len) { printf("输入的位置%d不合法!\n",pos); } //定义一个指针指向要删除的结点方便后续释放 doubleLinkList* p=head; int i; for(i=0;i<pos;i++) { p=p->next; } //p就是要删除的结点 p->prev->next=p->next; //当结点不为最后一个节点时,需要将该结点的后一位的前驱指针指向上一个结点 //当结点为最后一个节点则不需要,若不分情况考虑则会出现段错误; if(p->next!=NULL) { p->next->prev=p->prev; } free(p); head->text.len--;
}
//遍历
void show_doubleLinkList(doubleLinkList* head)
{ doubleLinkList* p=head; if(isEmpty(head)) { printf("链表为空!\n"); } while(p->next!=NULL) { p=p->next; printf("%d ",p->text.data); } printf("\n"); return;
}
头文件:
#ifndef __doubleLinkList_H__
#define __doubleLinkList_H__
typedef int datatype;
union msg{ //若数据的类型也为int,则不需要这个联合体
datatype data;
int len; //放头结点,记录链表长度
};
typedef struct node{union msg text;struct node* next; //指针,由于指针指向这一整个节点,所以类型为struct node*struct node* prev;
}doubleLinkList; doubleLinkList* create_doubleLinkList();void insertHead_doubleLinkList(doubleLinkList* head,datatype num);void insertTail_doubleLinkList(doubleLinkList* head,datatype num);void deleteBypos_doubleLinkList(doubleLinkList* head,int pos);
void deleteTail_doubleLinkList(doubleLinkList* head);
void deleteHead_doubleLinkList(doubleLinkList* head);
void insertBypos_doubleLinkList(doubleLinkList* head,datatype num,int pos);
void show_doubleLinkList(doubleLinkList* head);
#endif