双链表是在操作系统中常用的数据结构,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱,其结点组成如下:
其示意图举例如下:
1、双链表结点定义:
- /* 数据元素类型 */
- typedefint Type;
-
- /* 双链表结点结构体 */
- typedefstruct _DListNode
- {
- struct _DListNode * prior;/* 指向直接前趋结点 */
- struct _DListNode * next;/* 指向直接后继结点 */
- Type data; /* 数据 */
- }DListNode;
-
2、相关操作示例
- /* 函数声明 */
- static DListNode *dlist_create(void);
- static int dlist_find(DListNode *dlist, Type find_data);
- static DListNode *dlist_change(DListNode *dlist, int pos, Type new_data);
- static DListNode *dlist_insert(DListNode *dlist, Type insert_data, int pos);
- static DListNode *dlist_delete(DListNode *dlist, Type del_data);
- static void dlist_print_int(DListNode *dlist);
-
(1)创建一个双链表:(5,2,0,13,14)
示意图:
代码:
- static DListNode *dlist_create(void)
- {
- /* 创建第一个结点 */
- DListNode *node = (DListNode*)malloc(sizeof(DListNode));
- node->prior = NULL;
- node->next = NULL;
- node->data = list[0];
-
- /* 创建头指针并指向第一个结点 */
- DListNode *head = node;
-
- /* 创建其它结点并链接成双链表 */
- for (int i = 1; i < LEN; i++)
- {
- /* 创建新结点 */
- DListNode *new_node = (DListNode*)malloc(sizeof(DListNode));
- new_node->next = NULL;
- new_node->prior = head; /* 关键点1:新结点的prior指针指向前驱结点 */
- new_node->data = list[i];
-
- /* 改变前驱结点的next指针指向 */
- head->next = new_node; /* 关键点2:前驱结点的next指针指向新结点 */
-
- /* 头指针后移 */
- head = head->next;
- }
-
- return node;
- }
-
(2)元素查找:
- static int dlist_find(DListNode *dlist, Type find_data)
- {
- DListNode* temp = dlist;
- int pos = 1;
-
- while (temp)
- {
- if (find_data == temp->data)
- {
- return pos;
- }
- else
- {
- temp = temp->next;
- pos++;
- }
- }
-
- return ERROR;
- }
-
(3)元素替换:
- static DListNode *dlist_change(DListNode *dlist, int pos, Type new_data)
- {
- DListNode* temp = dlist;
-
- for (int i = 1; i < pos; i++)
- {
- temp = temp->next;
- }
- temp->data = new_data;
-
- return dlist;
- }
-
(4)结点插入:
- static DListNode *dlist_insert(DListNode *dlist, Type insert_data, int pos)
- {
- /* 创建新结点待插入 */
- DListNode *new_node = (DListNode*)malloc(sizeof(DListNode));
- new_node->next = NULL;
- new_node->prior = NULL;
- new_node->data = insert_data;
-
- if (pos > LEN + 1)
- {
- printf("插入的位置错误!\n");
- }
-
- /* 头部插入 */
- if (1 == pos)
- {
- dlist->prior = new_node; /* 步骤1 */
- new_node->next = dlist; /* 步骤2 */
- dlist = new_node; /* 步骤3 */
- }
- else
- {
- DListNode *temp = dlist;
- for (int i = 1; i < pos-1; i++)
- {
- temp = temp->next;
- }
- /* 中间插入 */
- if (temp->next != NULL)
- {
- new_node->next = temp->next; /* 步骤1 */
- new_node->prior = temp; /* 步骤2 */
- temp->next->prior = new_node; /* 步骤3 */
- temp->next = new_node; /* 步骤4 */
- }
- /* 尾部插入 */
- else
- {
- temp->next = new_node; /* 步骤1 */
- new_node->prior = temp; /* 步骤2 */
- }
- }
-
- return dlist;
- }
-
(5)结点删除:
- static DListNode *dlist_delete(DListNode *dlist, Type del_data)
- {
- DListNode *temp = dlist;
-
- while (temp)
- {
- if (del_data == temp->data)
- {
- temp->next->prior = temp->prior;
- temp->prior->next = temp->next;
- free(temp);
- return dlist;
- }
- temp = temp->next;
- }
-
- return dlist;
- }
-
3、验证
主函数:
- int main(void)
- {
- printf("创建一个双链表:");
- DListNode *dlist = dlist_create();
- dlist_print_int(dlist);
-
- printf("元素13所在的位置是:");
- int pos = dlist_find(dlist, 13);
- if (ERROR == pos)
- {
- printf("该元素不存在。\n");
- }
- else
- {
- printf("%d\n", pos);
- }
-
- printf("把第1个位置的元素替换为2020得到新的双链表为:");
- dlist = dlist_change(dlist, 1, 2020);
- dlist_print_int(dlist);
-
- printf("第2个位置插入888得到新的双链表为:");
- dlist = dlist_insert(dlist, 888, 2);
- dlist_print_int(dlist);
-
- printf("删除元素2得到新的双链表为:");
- dlist = dlist_delete(dlist, 2);
- dlist_print_int(dlist);
-
- return0;
- }
-
运行结果:
完整代码:
以上就是本次分享的双链表的笔记,希望各位喜欢!如有错误欢迎指出。以上代码仅用于学习使用,可能没有那么完善、严谨,还望谅解。