typedef struct DlinkedNode{
char data;
struct DlinkedNode *previous;
struct DlinkedNode *next;
}DLNode,*DLNodePtr;
2.初始化
DLNodePtr initlinkList(){
DLNodePtr tempHeader=(DLNodePtr)malloc(sizeof(DLNode));
tempHeader->data=' ';
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("rn");
}
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
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("位置不合要求rn");
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("此值不存在rn");
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运行结果#include //结构体的创建 typedef struct DlinkedNode{ char data; struct DlinkedNode *previous; struct DlinkedNode *next; }DLNode,*DLNodePtr; //初始化 DLNodePtr initlinkList(){ DLNodePtr tempHeader=(DLNodePtr)malloc(sizeof(DLNode)); tempHeader->data=' '; 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("rn"); } //头插法 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 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("位置不合要求rn"); 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("此值不存在rn"); 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, %drn",&tempNode1, &tempNode1.data, &tempNode1.next); printf("The second node: %d, %d, %drn",&tempNode2, &tempNode2.data, &tempNode2.next); tempNode1.next = &tempNode2; } int main(){ test(); basicAddressTest(); }
!olleH !olleHWorld! SWPU!olleHWorld! SP!olleHWorld! SPollHWorld!
这里有一个问题还未解决,按位置删除时,我给的位置是2和3,运行结果删掉的确是W和U



