博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
双向链表的简单操作
阅读量:3527 次
发布时间:2019-05-20

本文共 4319 字,大约阅读时间需要 14 分钟。

data.h

#ifndef _DATA_H_#define _DATA_H_typedef struct DbNode{	int data;	struct DbNode *left;	struct DbNode *right;}DbNode;#endif

 

doubleLinklist.h

#ifndef DOUBLE_LINKLIST_H#define DOUBLE_LINKLIST_H#include "data.h"#include 
#include
DbNode* CreateNode(int data){ DbNode *pnode = (DbNode*)malloc(sizeof(DbNode)); pnode->data = data; pnode->left = pnode->right = NULL;#ifdef DEBUG printf("%s data = %d\n",__FUNCTION__,data);#endif return pnode;}DbNode* CreateList(int head){ DbNode *pnode = (DbNode*)malloc(sizeof(DbNode)); pnode->data = head; pnode->left = pnode->right = NULL;#ifdef DEBUG printf("%s head = %d\n",__FUNCTION__,head);#endif return pnode;}DbNode* AppendNode(DbNode* head,int data){ DbNode* node = CreateNode(data); DbNode* p = head; DbNode* q; while(p != NULL) { q = p; p = p->right; } q->right = node; node->left = q;#ifdef DEBUG printf("%s data = %d\n",__FUNCTION__,data);#endif return head;}int GetLength(DbNode* head){ int count = 1; DbNode* pnode = NULL; if(head == NULL) return 0; pnode = head->right; while(pnode != NULL) { pnode = pnode->right; count++; } return count;}void PrintList(DbNode* head){ DbNode* pnode = NULL; if(head == NULL) return; pnode = head; printf("Double list show as below\n"); while(pnode != NULL) { printf("%d ",pnode->data); pnode = pnode->right; } printf("\n");}int FindNode(DbNode* head,int find_this_data){ int pos = 0; DbNode* pnode = head; if(head == NULL) return -1; while(pnode->right != NULL && pnode->data != find_this_data) { pnode = pnode->right; pos++; } /* * There is no this specific number * */ if(pnode->right == NULL && pnode->data != find_this_data) return -2; return pos + 1;}DbNode* FindNode2(DbNode* head,int data){ DbNode* pnode = head; /* * 链表为空 * */ if(head == NULL) return NULL; /* * 找到数据或者到达链表尾部就退出while循环 * */ while(pnode->right != NULL && pnode->data != data) pnode = pnode->right; /* * 没有找到数据为data的结点 * */ if(pnode->right == NULL && pnode->data != data) return NULL; return pnode;}void InsertNode(DbNode* head,int insert_after_this_pos,int insert_this_data){ /* * 如果头结点为空,什么都不操作 * */ DbNode* newNode = CreateNode(insert_this_data); int len; if(head == NULL) return; else len = GetLength(head); if(len < insert_after_this_pos) { printf("Insert out of range\n"); return; } DbNode* pnode = head; int tmpPos = 0; while(pnode->right != NULL && tmpPos < insert_after_this_pos - 1) { pnode = pnode->right; tmpPos++; } /* * 如果pnode是最后一个结点 * */ if(pnode->right == NULL) { pnode->right = newNode; newNode->left = pnode; } else//是中间的结点 { /* * 新结点的right指向pnode结点的下一个结点 * */ newNode->right = pnode->right; /* * pnode的下一个结点的left指向newNode * */ pnode->right->left = newNode; /* * pnode的right指向newNode * */ pnode->right = newNode; /* * newNode的left指向pnode * */ newNode->left = pnode; }}DbNode* DeleteNode(DbNode* head,int del_this_data){ DbNode* ptmp = NULL; DbNode* pnode = FindNode2(head,del_this_data); /* * 要删除的结点不存在,返回head不做任何操作 * */ if(pnode == NULL) { printf("There is no %d in the linklist\n",del_this_data); return head; } /* *要删除的结点是第一个结点 * */ else if(pnode->left == NULL) { /* * 让第二个结点作为头结点 * */ head = pnode->right; /* * 链表不为空 * */ if(head != NULL) head->left = NULL; } /* *要删除的结点是最后一个结点 *让倒数第二个结点的right指向null * */ else if(pnode->right == NULL) pnode->left->right = NULL; /* * 要删除的结点是中间的结点 * */ else { /* * pnode结点的上一个结点的right指向pnode的下一个结点 * */ pnode->left->right = pnode->right; /* * pnode的下一个结点的left指向pnode的上一个结点 * */ pnode->right->left = pnode->left; } free(pnode); return head;}#endif

main.c

#include "doubleLinklist.h"int main(){	DbNode* head = CreateList(0);	int i;	for(i = 1; i < 9; i++)		head = AppendNode(head,i);	PrintList(head);	int len = GetLength(head);	printf("len(linklist) = %d\n",len);	printf("Find:");	int find;	scanf("%d",&find);	int res = FindNode(head,find);	if(res < 0)		printf("No this data\n");	else		printf("Data pos = %d\n",res);	printf("InsertPos[0,len] & data:");	int insertPos,insertData;	scanf("%d,%d",&insertPos,&insertData);	InsertNode(head,insertPos,insertData);		printf("Insert %d after pos %d\n",insertData,insertPos - 1);	PrintList(head);	int del;	printf("Delete data:");	scanf("%d",&del);	head = DeleteNode(head,del);	printf("Delete %d from linklist!!!\n",del);	PrintList(head);	return 0;}

 

转载地址:http://mxuhj.baihongyu.com/

你可能感兴趣的文章
springboot实现CAS的server服务器端的搭建,并实现链接mysql数据库,自定义加密算法
查看>>
Python超详细的安装教程
查看>>
小甲鱼Python第一讲(我和Python的第一次亲密接触)
查看>>
小甲鱼Python第三讲(小插曲之变量和字符串)
查看>>
小甲鱼Python第十一讲(一个打了激素的数组2)
查看>>
小甲鱼Python第十三讲(戴上了枷锁的列表)
查看>>
小甲鱼Python第十四讲(各种奇葩的内置方法)
查看>>
小甲鱼Python第十五讲(格式化)
查看>>
小甲鱼Python第十七讲(Python的乐高积木)
查看>>
小甲鱼Python第十八讲(函数:灵活即强大)
查看>>
小甲鱼Python第十九讲(函数,我的地盘听我的)
查看>>
小甲鱼python第二十讲(内嵌函数和闭包)
查看>>
小甲鱼Python第二十一讲(lambda表达式)
查看>>
小甲鱼Python第二十二讲(递归)
查看>>
小甲鱼Python第二十三讲、第二十四讲(递归-这帮小兔崽子、汉诺塔)
查看>>
小甲鱼Python第二十五讲、第二十六讲(字典)
查看>>
小甲鱼Python第二十七讲(集合)
查看>>
2020光学期刊一区二区影响因子发布(科睿唯安)
查看>>
可调谐半导体激光器的窄线宽测试及压缩
查看>>
matlab中 %d,%f,%c,%s
查看>>