单链表
来源:互联网 发布:java单元测试的好处 编辑:程序博客网 时间:2024/06/06 12:45
单链表
线性表的链式存储方式可以动态创建结点,逻辑相邻的元素在物理位置上不一定也要相邻,从而能够更好的利用内存空间。而且,对于插入和删除操作来讲,链表的效率要远远高于顺序表。
不同链表示意图:
#include <stdio.h>#include <stdlib.h>#define LEN sizeof(ListNode)int main(){ typedef char DataType; typedef struct node{ DataType data; struct node *next;}ListNode; typedef ListNode *LinkList; int n; printf("Choose a function:\n"); printf("1. To create a list from head\n"); printf("2. To create a list from tail\n"); printf("3. Print all the elements in the list\n"); printf("4. print the length of the list\n"); printf("5. To insert an element to the list\n"); printf("6. To delete an element from the list\n"); printf("7. Search the list\n"); printf("8. Esc this program\n"); LinkList head; head = ( LinkList )malloc( LEN ); // init a list head->next = NULL; scanf("%d", &n); while( n != 8){ getchar(); if( n == 1){ // To create a list from head ListNode *p, *temp; char ch; while( (ch = getchar()) != '\n'){ p = ( LinkList)malloc( LEN ); p->data = ch; temp = head->next; head->next = p; p->next = temp; } } if ( n ==2) { char ch; ListNode *temp, *p; temp = head; while( ( ch = getchar() ) != '\n'){ p = ( LinkList )malloc( LEN ); p->data = ch; temp->next = p; p->next = NULL; temp = p; } } if( n ==3 ){ ListNode *temp; temp = head; while( temp->next){ printf("%c ", temp->next->data); temp = temp->next; } printf( "\n"); } if ( n ==4){ int num=0; ListNode *temp; temp = head; while( temp->next){ num++; temp = temp->next; } printf("%d\n", num); } if ( n ==5 ){ int posi; char ch; ListNode *temp, *p; temp = head; printf("Please enter the char you want to insert:"); scanf("%c", &ch); printf("Please enter the position you want to insert the char: "); scanf("%d", &posi); p = ( LinkList )malloc( LEN ); p->data = ch; int i = 0; for( i = 0; i < posi - 1; i++) temp = temp->next; p->next = temp->next; temp->next = p; } if ( n ==6){ printf("Please enter the position of the char you want to delete: "); int posi; ListNode *temp; temp = head; scanf("%d", &posi); int i = 0; for(i = 0; i < posi - 1; i++) temp = temp->next; temp->next = temp->next->next; } if ( n ==7){ printf("Please enter the position number:"); int posi; ListNode *temp; temp = head; scanf("%d", &posi ); int i=0; for(i=0; i < posi; i++) temp = temp->next; printf("The char at position %d is %c\n", posi, temp->data); } scanf("%d", &n);}return 0;}
运行截图:
功能列表:
- 头插法初始化链表
- 尾插法初始化链表
- 打印链表所有元素
- 打印链表长度
- 向链表中插入元素
- 从链表中删除元素
- 按索引查询链表
- 退出程序
好吧,其实只是实现了单链表最最简单的几个功能,其他的还包括按值索引啊,还有在执行查找、插入和删除操作的的时候都没有执行检查,看看所给出的索引是否越界等等。这些功能可以在后面慢慢去完善。
关于在写这个小程序的时候的几点思考:
- 其实很早之前就翻过《算法导论》这本书,也在网上陆陆续续看了公开课的一些视频。但是因为本身不是计算机专业出身,C语言也好长时间没有碰过了,数据结构上来就是各种结构体、指针这种复杂艰深的东西,看的云里雾里,不明就里,也根本没有把代码自己写一写,所以没过几天就扔下了。最近重新看了下C语言和计算机基础理论方面的书,觉得好像有点懂了,于是就跑去图书馆拎了几本书回来,重新把数据结构拿出来看看,把代码写写,感觉比之前好多了。
- 其实你们看大部分的数据结构的书都是把功能实现写成函数了,对于基础不好的人来说有点语焉不详,只是拼凑成能够运行的小程序就要费很大的力气。所以这次除了拿了几本“权威”作为参考,还找了几本专为“业余”爱好者写的书。两种书结合起来看效果其实很好,“业余”可以用来入门,而且趣味性很强。学算法嘛,本来就是因为”思考的乐趣“啊 O(∩_∩)O~
- ”纸上得来终觉浅,绝知此事要躬行。“只是看看可能觉得不是太难,但是即使是最为普通的小程序,想好了思路再付诸实践的过程都有可能会错误百出,调试的你头昏脑胀,更不要说数据结构里面涉及的指针、结构体什么的了。所以,眼高手低是不对滴。
- 看书的时候很难静得下心来。其实看算法啊,数据结构啊还是需要大片的时间投入去好好思考的,但是总是会有零散的事情打断,专注力和记忆力是很重要的能力。
- 告诉自己不忘初心,方得始终。于任何人都是,怀着赤子之心的人看上去总是与众不同。
- 多写写有趣的小程序。现在总是爱看实践的书,写些有趣的小玩意特有成就感,嗯,很快乐。
坚持。这种一个人趴在电脑前写代码的日子一点也不好熬,技术的卓越背后是逼着自己坚持前行。
- e.g. 代码量与编程水平关系的传说:
- 微软要求应聘程序员在大学四年间至少写10万行代码
- 100万行 -- 高手??
你能写多少代码呢?当然,多少并不是衡量的唯一标准,就像有些人无聊的就只剩下向你炫耀他的忙碌了。
- e.g. 代码量与编程水平关系的传说: