1. 结构体的创建
typedef struct DlinkedNode{
char data;
struct DlinkedNode *previous;
struct DlinkedNode *next;
}DLNode,*DLNodePtr;
2.初始化
DLNodePtr initlinkList(){
DLNodePtr tempHeader=(DLNodePtr)malloc(sizeof(DLNode));
tempHeader->data='\0';
tempHeader->previous=NULL;
tempHeader->next=NULL;
return tempHeader;
}
3. 打印链表
void printList(DLNodePtr paraHeader){
DLNodePtr p=paraHeader->next;
while(p!=NULL){
printf("%c",p->data);
p=p->next;
}
printf("\r\n");
}
4.头插法
void insertByHead(DLNodePtr paraHeader,char paraChar){
DLNodePtr p,q;
p=paraHeader;
//Step1.创建新结点
q=(DLNodePtr)malloc(sizeof(DLNode));
q->data=paraChar;
//Step2.插入
if(p->next!=NULL){
p->next->previous=q;
}
q->next=p->next;
q->previous=p;
p->next=q;
}
5. 尾插法
void insertByTail(DLNodePtr paraHeader,char paraChar){
DLNodePtr p,q;
p=paraHeader;
//Step1.创建新结点
q=(DLNodePtr)malloc(sizeof(DLNode));
q->data=paraChar;
//Step2.插入
while(p->next){
p=p->next;
}
p->next=q;
q->previous=p;
q->next=NULL;
}
6.指定位置插入
void insertByPos(DLNodePtr paraHeader,char paraChar,int paraPosition){
DLNodePtr p,q;
//Step1.找到位置
p=paraHeader;
for(int i=0;i<paraPosition;i++){
p=p->next;
if(p==NULL){
printf("不存在此位置");
return;
}
}
//Step2.创建新结点
q=(DLNodePtr)malloc(sizeof(DLNode));
q->data=paraChar;
//Step3.插入
if(p->next!=NULL){
p->next->previous=q;
}
q->next=p->next;
p->next=q;
q->previous=p;
}
7.按位置删除
void deleteBypos(DLNodePtr paraHeader,int paraPosition){
DLNodePtr p=paraHeader;
//Step1.定位
if(paraPosition<1){
printf("位置不合要求\r\n");
return;
}
for(int i=1;i<=paraPosition;i++){
p=p->next;
}
//Step2.删除结点
p->previous->next=p->next;
if(p->next!=NULL){
p->next->previous=p->previous;
}
free(p);
}
8.按值删除
void deleteByData(DLNodePtr paraHeader,char paraChar){
DLNodePtr p=paraHeader,q;
//Step1.定位
while((p->next!=NULL)&&(p->next->data!=paraChar)){
p=p->next;
}
//Step2.Error check
if(p->next==NULL){
printf("此值不存在\r\n");
return;
}
//Step3.删除
q=p->next;
p->next=q->next;
if(q->next!=NULL){
q->next->previous=p;
}
free(q);
}
9.摧毁链表
void DestroyLink(DLNodePtr paraHeader){
DLNodePtr p=paraHeader,q;
while(p){
p=p->next;
q=p;
free(q);
}
p->next=NU
完整代码
#include<stdio.h>
#include<malloc.h>
//结构体的创建
typedef struct DlinkedNode{
char data;
struct DlinkedNode *previous;
struct DlinkedNode *next;
}DLNode,*DLNodePtr;
//初始化
DLNodePtr initlinkList(){
DLNodePtr tempHeader=(DLNodePtr)malloc(sizeof(DLNode));
tempHeader->data='\0';
tempHeader->previous=NULL;
tempHeader->next=NULL;
return tempHeader;
}
//打印链表
void printList(DLNodePtr paraHeader){
DLNodePtr p=paraHeader->next;
while(p!=NULL){
printf("%c",p->data);
p=p->next;
}
printf("\r\n");
}
//头插法
void insertByHead(DLNodePtr paraHeader,char paraChar){
DLNodePtr p,q;
p=paraHeader;
//Step1.创建新结点
q=(DLNodePtr)malloc(sizeof(DLNode));
q->data=paraChar;
//Step2.插入
if(p->next!=NULL){
p->next->previous=q;
}
q->next=p->next;
q->previous=p;
p->next=q;
}
//尾插法
void insertByTail(DLNodePtr paraHeader,char paraChar){
DLNodePtr p,q;
p=paraHeader;
//Step1.创建新结点
q=(DLNodePtr)malloc(sizeof(DLNode));
q->data=paraChar;
//Step2.插入
while(p->next){
p=p->next;
}
p->next=q;
q->previous=p;
q->next=NULL;
}
//指定位置插入
void insertByPos(DLNodePtr paraHeader,char paraChar,int paraPosition){
DLNodePtr p,q;
//Step1.找到位置
p=paraHeader;
for(int i=0;i<paraPosition;i++){
p=p->next;
if(p==NULL){
printf("不存在此位置");
return;
}
}
//Step2.创建新结点
q=(DLNodePtr)malloc(sizeof(DLNode));
q->data=paraChar;
//Step3.插入
if(p->next!=NULL){
p->next->previous=q;
}
q->next=p->next;
p->next=q;
q->previous=p;
}
//统计元素个数
int Number(DLNodePtr paraHeader,int paraData){
DLNodePtr p;
int num=0;
p=paraHeader;
while(p){
if(p->data==paraData){
num++;
p=p->next;
}
}
return num;
}
//按位置删除
void deleteBypos(DLNodePtr paraHeader,int paraPosition){
DLNodePtr p=paraHeader;
//Step1.定位
if(paraPosition<1){
printf("位置不合要求\r\n");
return;
}
for(int i=1;i<=paraPosition;i++){
p=p->next;
}
//Step2.删除结点
p->previous->next=p->next;
if(p->next!=NULL){
p->next->previous=p->previous;
}
free(p);
}
//按值删除
void deleteByData(DLNodePtr paraHeader,char paraChar){
DLNodePtr p=paraHeader,q;
//Step1.定位
while((p->next!=NULL)&&(p->next->data!=paraChar)){
p=p->next;
}
//Step2.Error check
if(p->next==NULL){
printf("此值不存在\r\n");
return;
}
//Step3.删除
q=p->next;
p->next=q->next;
if(q->next!=NULL){
q->next->previous=p;
}
free(q);
}
//摧毁链表
void DestroyLink(DLNodePtr paraHeader){
DLNodePtr p=paraHeader,q;
while(p){
p=p->next;
q=p;
free(q);
}
p->next=NULL;
}
//测试
void test(){
//Step1.建一个空表
DLNodePtr tempList=initlinkList();
printList(tempList);
//Step2.头插法插入一些元素
insertByHead(tempList,'H');
insertByHead(tempList,'e');
insertByHead(tempList,'l');
insertByHead(tempList,'l');
insertByHead(tempList,'o');
insertByHead(tempList,'!');
printList(tempList);
//Step2.尾插法插入一些元素
insertByTail(tempList,'W');
insertByTail(tempList,'o');
insertByTail(tempList,'r');
insertByTail(tempList,'l');
insertByTail(tempList,'d');
insertByTail(tempList,'!');
printList(tempList);
//Step3.指定位置插入
insertByPos(tempList, 'S', 0);
insertByPos(tempList, 'W', 1);
insertByPos(tempList, 'P', 2);
insertByPos(tempList, 'U', 3);
printList(tempList);
//Step5.按位置删除
deleteBypos(tempList,2);
deleteBypos(tempList,3);
printList(tempList);
//Step6.按值删除
deleteByData(tempList,'e');
deleteByData(tempList,'!');
printList(tempList);
//销毁
DestroyLink(tempList);
}
//地址测试
void basicAddressTest(){
DLNode tempNode1,tempNode2;
tempNode1.data = 4;
tempNode1.next = NULL;
tempNode2.data = 6;
tempNode2.next = NULL;
printf("The first node: %d, %d, %d\r\n",&tempNode1, &tempNode1.data, &tempNode1.next);
printf("The second node: %d, %d, %d\r\n",&tempNode2, &tempNode2.data, &tempNode2.next);
tempNode1.next = &tempNode2;
}
int main(){
test();
basicAddressTest();
}
运行结果
!olleH
!olleHWorld!
SWPU!olleHWorld!
SP!olleHWorld!
SPollHWorld!
这里有一个问题还未解决,按位置删除时,我给的位置是2和3,运行结果删掉的确是W和U