数据结构之双向链表（C语言实现）

3 篇文章 0 订阅

双向链表由前驱指针和后项指针还有数据域组成，把节点之间的前后指针相连接形成链表

typedef struct Node {
int data;//内容
struct Node* frontNode;//前驱指针
struct Node* nextNode;//后项指针
}*LPNODE;

typedef struct List {
struct Node* TailNode;//尾节点
int curSize;//万金油参数
}*LPLIST;

LPNODE CreateHeadNode() {
}
LPNODE CreateTailNode() {
LPNODE tailNode = (LPNODE)malloc(sizeof(Node));
assert(tailNode);
tailNode->frontNode = NULL;
tailNode->nextNode = NULL;
return tailNode;
}

LPNODE CreateNode(int data) {
LPNODE newNode = (LPNODE)malloc(sizeof(Node));
assert(newNode);
newNode->data = data;//和头节点，尾节点不同，所要插入的节点是要初始化data的
newNode->frontNode = NULL;
newNode->nextNode = NULL;
return newNode;
}

LPLIST CreateList() {
LPLIST list = (LPLIST)malloc(sizeof(List));//申请一个List大小的内存
assert(list);//判空
list->curSize = 0;//当前节点为0
list->TailNode =CreateTailNode();//初始化尾节点
return list;
}

代码如下:

void insertByHead(LPLIST list, int data) {
LPNODE newNode = CreateNode(data);
if(list->curSize==0)//当没有节点时
list->TailNode = newNode;//为节点指向新节点
else {
}
list->curSize++;//每插入一个，增加一个节点数目
}

void insertByTail(LPLIST list, int data) {
LPNODE newNode = CreateNode(data);
if (list->curSize == 0)//节点为空时
else {
list->TailNode->nextNode = newNode;//直接插在后面
newNode->frontNode = list->TailNode;
}
list->TailNode = newNode;//改变尾节点
list->curSize++;
}

void insertByAppoint(LPLIST list, int data, int posData) {
while (curNode != NULL && curNode->data != posData) {//没有找到就一直找，找到CurNode为空
LeftNode = curNode;//移动左指针
curNode = curNode->nextNode;//移动当前指针
}
LPNODE newNode = CreateNode(data);//创建新节点
//后面就是插入中间的操作
LeftNode->nextNode = newNode;
newNode->frontNode = LeftNode;
if (curNode == NULL)//尾节点改变
list->TailNode = newNode;
if (curNode != NULL) {
newNode->nextNode = curNode;
curNode->frontNode = newNode;
}
list->curSize++;//节点个数增加
}

void DeleteByAppoint(LPLIST list, int posData) {
while (curNode != NULL && curNode->data != posData) {
frontNode = curNode;
curNode = curNode->nextNode;
}
if (curNode == NULL)//如果找不到就返回
return;
//连接curNode前后位置的节点
frontNode->nextNode = curNode->nextNode;
curNode->nextNode->frontNode = frontNode;
free(curNode);//释放内存
curNode = NULL;
list->curSize--;//删除一个，节点少一个
}

1.如果要插入到最后面，就不需要把后项指针的前驱指针指向前面的节点，因为误操作空指针会引发程序中断

2.新节点当插入到最后的位置时，尾节点要发生改变

void insertBySqList(LPLIST list, int Mydata) {
while (PosNode != NULL && PosNode->data < Mydata) {
frontNode = PosNode;//移动
PosNode = PosNode->nextNode;//移动
}
LPNODE newNode = CreateNode(Mydata);//新节点创建
frontNode->nextNode = newNode;
newNode->frontNode = frontNode;
if (PosNode == NULL)//改变尾节点
list->TailNode = newNode;
if (PosNode != NULL) {
PosNode->frontNode = newNode;
newNode->nextNode = PosNode;
}
list->curSize++;
}

1.从头到尾

void printListByHead(LPLIST list) {
printf("头输出:\t");
while (pMove) {
printf("%d\t", pMove->data);
pMove = pMove->nextNode;
}
printf("\n");
}

2.从尾到头

void printListByTail(LPLIST list) {
printf("尾输出:\t");
LPNODE pMove = list->TailNode;
printf("%d\t", pMove->data);
pMove = pMove->frontNode;
}
printf("\n");
}

int main() {
LPLIST list = CreateList();
printf("\n尾插法\n");
for (int i = 0; i < 5; i++)
insertByTail(list, i);
printListByTail(list);
printf("删除指定数据的");
DeleteByAppoint(list, 3);
LPLIST list2 = CreateList();
printf("\n头插法\n");
for (int i = 0; i < 5; i++)
printListByTail(list2);
printf("删除指定数据的");
DeleteByAppoint(list2, 2);
printListByTail(list2);
printf("插入指定数据的");
insertByAppoint(list2, 100, 2);
printListByTail(list2);
printf("插入指定数据的");
LPLIST list3 = CreateList();
int array[] = { 3,5,9,7,2,6 };
printf("有序链表构建的");
for(int i=0;i<6;i++)
insertBySqList(list3, array[i]);
printListByTail(list3);
printf("有序链表构建的");
return 0;
}

• 4
点赞
• 1
评论
• 2
收藏
• 打赏
• 扫一扫，分享海报

04-14
12-10 1万+

03-18 370
05-10 911
01-29 439
12-01 1万+
02-18 1163
09-02 2万+
03-03 128
06-30 313
07-07 6603
08-30 60
07-10 1360
03-29

Descending Angel

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。