双向链表简单实现
2015-09-20 21:08
302 查看
/********************************************************************************* * Copyright: (C) 2015 songyong<handy_skyoutlook.com> * All rights reserved. * * Filename: double_link.c * Description: This file * * Version: 1.0.0(2015年09月20日) * Author: sky <handy_sky@outlook.com> * ChangeLog: 1, Release initial version on "2015年09月20日 16时30分20秒" * ********************************************************************************/ #include<stdio.h> #include<stdlib.h> #define LINK_LEN sizeof(struct double_link) typedef struct double_link { int data; struct double_link *pre; struct double_link *next; }db_link; void print(db_link *head); db_link *insert_link_tail(db_link *head); db_link *create_link(); db_link *delete_link(db_link *head); int i = 0; /******************************************************************************** * Description: * Input Args: * Output Args: * Return Value: ********************************************************************************/ int main (int argc, char **argv) { db_link *phead = NULL; phead = create_link(); phead = insert_link_tail(phead); print(phead); phead = delete_link(phead); print(phead); return 0; } /* ----- End of main() ----- */ db_link *create_link() { db_link *head, *p, *s; head = (db_link *)malloc(LINK_LEN); p = head; int n = 0; printf("please input data about how many link to create:"); scanf("%d",&n); if(NULL == head) { printf("malloc fail\n"); return 0; } head->pre = NULL; head->next = NULL; for(; n > 0; n--) { i++; printf("please input a link\n"); s = (db_link *)malloc(LINK_LEN); scanf("%d",&s->data); p->next = s; s->pre = p; p = s; } p->next = NULL; return head; } db_link *insert_link_tail(db_link *head) { db_link *p =head; db_link *s = NULL; int n = 0; print(p); printf("please choise insert address(0 - %d)\n",i);//0为第一个节点的为位置,1为第二个节点的位置 scanf("%d",&n); while(n > i || n < 0) { printf("error:please choise 0 - 5\n"); exit(0); } for(; n > 0; n--) p = p->next; printf("please input a new link to inset:\n"); s = (db_link *)malloc(sizeof(LINK_LEN)); scanf("%d",&s->data); if(NULL == p->next) { p->next = s; s->pre =p; s->next = NULL; } else { s->pre = p; s->next = p->next; p->next->pre = s; p->next = s; } i++; return head; } void print(db_link *head) { db_link *temp = head->next; for(;temp != NULL;temp = temp->next) printf(" %d ",temp->data); printf("\n"); } db_link *delete_link(db_link *head) { db_link *p =head; int n; printf("Now,we have %d links.\n",i); printf("please choice a link to delete:\n"); scanf("%d",&n); if(n <= 0 || n >i ) { printf("please input data 0 < n <= %d\n",i);//保证头结点不被删除 exit(0); } for(;n > 0; n--) p = p->next; if(p->next) { p->next->pre = p->pre; p->pre->next = p->next; } else p->pre->next = NULL; free(p); return head; }
补上简单的双向链表逆置:
void reverse_link(db_link *head) { db_link *p = head; for(;NULL != p->next; p = p->next);//找到末节点; printf("reverse link:\n"); while(p->pre) { printf(" %d ",p->data); p = p->pre; } printf("\n"); }
相关文章推荐
- SAX之:SAXParserFactory与SAXParser
- poj1094
- 关于 行舟 关于 进退
- Python 包管理工具
- 对象在内存中的存储
- 解决 Android Studio 乱码问题
- swift函数的用法,及其嵌套实例
- C++ 1. 基础语法 输入输出、流程控制、初识类
- JS中关于clientWidth offsetWidth scrollWidth 等的区别
- java中加载声音文件的方法
- [转]KVC 与 KVO 理解 自己动手实现KVO
- 关于html开发移动应用的开发的一些优缺点
- 高考题(可作为试讲资料)
- Intellij idea 14.4创建web工程并与tomcat服务集成
- ACM-ICPC国际大学生程序设计竞赛北京赛区(2015)网络赛 二分查找交点个数
- iOS程序-UIScrollView的基本使用
- 第一节 Linux系统简介
- 软件测试计划与测试需求
- hdu2647拓扑排序(逆向)
- Java计算器程序代码