问题11:双链表的相关操作
来源:互联网 发布:有20个usb端口的电脑 编辑:程序博客网 时间:2024/06/04 00:51
主要涉及双链表的建立、测长、打印、插入结点以及删除结点等。
实际上跟单链表的操作差不多,只是要特别注意双链表多了指向前驱结点的指针,在写相关代码的时候要特别小心,别弄错了。
代码如下:
#include <stdio.h>#include <malloc.h>typedef struct student{ int data; struct student *next; struct student *pre;}dnode;dnode *creat(){ dnode *head, *p, *s; int input, cycle = 1; head = (dnode *)malloc(sizeof(dnode)); p = head; while(cycle) { printf("\nplease enter the data:"); scanf("%d", &input); if(input != 0) { s = (dnode *)malloc(sizeof(dnode)); s->data = input; printf("\n%d", s->data); p->next = s; s->pre = p; p = s; } else cycle = 0; } head = head->next; head -> pre = NULL; printf("\nThe value of the first node is: %d", head->data); p->next = NULL; return head;}//双链表测长,可以看出代码其实跟前面的单链表测长一样int length(dnode *head){ dnode *p;p = head;int count = 0;while(p){ p = p->next; count++;}return count;}//打印链表void print(dnode *head){ dnode *p; int len = length(head); printf("\nNOW %d node(s) in the List:", len); p = head; if(head != NULL) { while(p) { printf("\n ¥¥¥¥¥ %d", p->data); p = p->next; } }}//双链表删除结点//双链表的删除也别忘了有大致4种情况//一是没有找到,二是在第一个结点,三是在最后一个结点,四是在中间的情况dnode *delete_from_dlist(dnode *head, int num){ if(head == NULL) { printf("\n链表为空!!"); return head; } dnode *current = head; while(num != current->data && current->next != NULL) { current = current->next; } if(num == current->data) { if(current == head) { head = head->next; head->pre = NULL; free(current); } else if(current->next == NULL) { current->pre->next = NULL; free(current); } else { current->pre->next = current->next; current->next->pre = current->pre; free(current); } } else { printf("\nNODE NOT FOUND!!"); } return head;}//双链表插入结点dnode *insert_to_list(dnode *head, int num){ dnode *cur, *insert_node; cur = head; insert_node = (dnode *)malloc(sizeof(dnode)); insert_node -> data = num; while(insert_node->data > cur->data && cur->next != NULL) { cur = cur->next; } if(insert_node->data <= cur->data) { if(cur == head) { insert_node->next = cur; cur->pre = insert_node; head = insert_node; } else { insert_node->next = cur; insert_node->pre = cur->pre; cur->pre->next = insert_node; cur->pre = insert_node; } } else { cur->next = insert_node; insert_node->pre = cur; insert_node->next = NULL; } return head;}int main(void){ dnode *List = creat(); print(List); List = delete_from_dlist(List, 4); print(List); List = insert_to_list(List, 5); print(List); return 0;}
运行结果如下:
- 问题11:双链表的相关操作
- iframe操作的相关问题。
- 双链表的相关操作
- c#操作excel的相关问题
- 关于freemarker操作word的相关问题
- 关于双链表的相关操作
- java操作本地磁盘目录下的问题相关资料
- pip相关操作与可能遇到的问题
- conda相关操作与可能遇到的问题
- telnet相关操作与问题
- 多表操作相关问题
- (二)双链表的构造及相关操作
- 文件的相关操作
- 数据库的相关操作
- 数据库的相关操作
- 注册表的相关操作
- 图的相关操作
- 栈的相关操作
- Ehlib 的 DBGridEh 控件导出到Excel的三种封装过程/函数
- [C# 基础知识系列]专题一:深入解析委托——C#中为什么要引入委托
- 减少文件特征码的一些方法与技巧
- 一种保护眼睛的好方法
- 浏览器是如何工作的系列:CSS2可视化模型
- 问题11:双链表的相关操作
- 详谈 vc++源码免杀全套思路方法
- fight club
- hdu 4712
- node.js对mongodb的一些操作
- hdu 3259 An interesting mobile game (dfs+bfs+模拟)
- my hibernate note
- hdu4714 Tree2cycle 树形DP
- 飞腾评卷系统单机版上线