C语言实现双向链表(无法运行)
插入过程要在草稿纸上画才更懂
test.h
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int id;
char * name;
}ElementType;
//双向链表的节点,一个数据域,两个指针域
typedef struct DoublyNode{
ElementType data;
struct DoublyNode * prev; //前指针
struct DoublyNode * next; //后指针
}DoublyNode;
typedef struct DoublyLinkList{ //双向链表头节点
int length;
DoublyNode * next;
}DoublyLinkList;
//插入元素
void InsertDoublyLinkList(DoublyLinkList * dlList,int pos,ElementType element);
void PrintLinkList(DoublyLinkList * dlList);
#endif // TEST_H_INCLUDED
test.c
#include "test.h"
void InsertDoublyLinkList(DoublyLinkList * dlList,int pos,ElementType element){
//创建空节点
DoublyNode * node = (DoublyNode *)malloc(sizeof(DoublyNode));
node->data = element;
node->next = NULL;
node->prev = NULL;
if (pos==1){ // 在第一个位置加入节点
node->next = dlList->next;
dlList->next = node;
node->next->prev = node;
dlList->length++;
return;
}
//定义currNode,其为插入位置的前一个节点
DoublyNode * currNode = dlList->next;
for (int i =0;currNode && i<pos-1;i++){
currNode = currNode->next;
}
if (currNode){
node->prev = currNode;
if (currNode->next){
currNode->next->prev = node;
}
currNode->next = node->next;
currNode->next = node;
dlList->length++;
}
}
void PrintLinkList(DoublyLinkList * dlList){
DoublyNode * currentNode = dlList->next;
if (!currentNode){
printf("DoublyLinkList is NULL.\n");
dlList->length=0;
}
for(int i=0;i<dlList->length;i++){
printf("%d技能 %s.\n",currentNode->data.id,currentNode->data.name);
currentNode = currentNode->next;
}
}
main.c
#include "test.h"
ElementType dataArray[] = {
{1,"侠客行"},
{2,"将进酒"},
{3,"神来之笔"},
{4,"青莲剑歌"}
};
int main()
{
test();
return 0;
}
void test(){
DoublyLinkList dlList;
dlList.length=0;
InsertDoublyLinkList(&dlList,1,dataArray[0]);
PrintLinkList(&dlList);
}