自整的面试题目及代码---单链表的创建、测长、打印、删除、插入
来源:互联网 发布:java log4j日志 xml 编辑:程序博客网 时间:2024/05/29 16:36
即将步入大四了,要开启找工作的模式了,遂复习C语言基础知识。复习的同时整理出来分享给大家,同处一个时期的同学可以参考交流。更希望能获得各位大牛、前辈的指导!谢谢!另外,此次整理的部分参考来自《程序员面试宝典》,特此注明。
链表是数据结构考察的一个基本点,是面试官喜欢反复发问的一部分。事实上链表的复杂程度并不亚于树、图等数据结构。此次分享最基本的单链表的一些操作。
单链表的创建:
#include <iostream>#include <stdio.h>#include <string.h>#include <conio.h>using namespace std;//创建单链表typedef struct student{ int data; struct student *next;}node;node *creat(){ node *head, *p, *q; int x, cycle = 1; head = (node*)malloc(sizeof(node));//开辟新空间 p = head; while (cycle) { printf("Please input the data:"); scanf_s("%d", &x); //输入要插入的数据 if (x != 0) //以0结束创建 { q = (node*)malloc(sizeof(node)); q->data = x; printf("Success creat!\n", q->data); p->next = q; p = q; } else cycle = 0; } p->next = NULL; //表尾置空 head = head->next; return(head);}
创建的最后注意表位置空。
单链表的测长及打印:
//测单链表长int length(node *head){ int n = 0; node *p; if (head == NULL) //如果链表为空,返回0 return 0; p = head; while (p != NULL) //单链表遍历计数 { n++; p = p->next; } return(n);}//单链表打印void print(node *head){ node *p; if (head == NULL) //如果链表为空,则提示 { printf("The linkedlist is NULL!"); return; } p = head; while (p != NULL) { printf("\n node %d ", p->data); p = p->next; }}
测长和打印过程中,注意对空链表的情况做处理。
单链表的插入:
node *insert(node *head, int num){ node *p0, *p1, *p2; p1 = head; p2 = head; p0 = (node *)malloc(sizeof(node)); p0->data = num; if (head != NULL) { while (p0->data > p1->data&&p1->next != NULL) { p2 = p1; p1 = p1->next; } if (p0->data <= p1->data) { if (head == p1) //插入到链表开头 { p0->next = p1; head = p0; } else //插入到链表中间 { p2->next = p0; p0->next = p1; } } else //插入到末尾 { p1->next = p0; p0->next = NULL; } } else //链表为空,直接插入 { head = p0; head->next = NULL; } return head;}
同样要注意判断传入的链表是否为空,是的话要特殊操作,否则会引起程序地址访问出错,导致程序崩溃。同时要分别判断插入到表头、表中、表尾三种情况,做不同的操作。
单链表的删除:
//删除节点(注意有重复节点应如何处理)node *del(node *head, int num){ node *p1, *p2; int i = 0; p1 = head; p2 = head; while (1) { if (head != NULL) { while (num != p1->data && p1->next != NULL) { p2 = p1; p1 = p1->next; } if (num == p1->data) { i++; if (p1 == head)//要删除的节点在表头 { head = p1->next; free(p1); p1 = head; } else //在表中或表尾 { p2->next = p1->next; free(p1); p1 = p2; } } else break; } else break; } if (i == 0) printf("Not found! \n"); return head;}
删除中有一种情况,当表中有不止一个需要删除的节点时,要能全部找出并删去。
主函数:
void main(){ node *p; int n; int d; p = creat(); n = length(p); printf("Length is:%d \n", n); print(p); printf("\nPlease input the num that you want to delete:"); scanf_s("%d", &d); p = del(p, d); print(p); printf("\nPlease input the num that you want to insert:"); scanf_s("%d", &d); p = insert(p, d); print(p); system("pause");}
测试用例:
1
创建输入:2、3、4、5、0
删除输入:2
插入输入:1
2
创建输入:2、3、4、5、0
删除输入:3
插入输入:3
3
创建输入:2、3、4、5、0
删除输入:5
插入输入:6
4
创建输入:2、3、4、5、0
删除输入:6
插入输入:3
5
创建输入:0
删除输入:3
插入输入:3
6
创建输入:2、3、3、5、0
删除输入:3
插入输入:6
之前在另外的材料上看到:如果你能够先写好测试用例再编写程序,将是一个难得的好习惯,与大家共勉。
欢迎同处一个时期的同学交流,更希望能获得各位大牛、前辈的指导!谢谢!
0 0
- 自整的面试题目及代码---单链表的创建、测长、打印、删除、插入
- 单链表的创建、测长、打印、插入和删除
- 单链表的创建、测长、打印、插入、删除、排序及逆置
- 双链表的创建、测长、打印、插入和删除
- 实现单向循环链表的创建、测长、打印、插入、删除及逆置
- 单链表的建立、测长、删除、插入、排序、逆置及打印(数据结构)
- 单链表的建立,测长,打印,删除,插入,排序,逆置
- 单链表的建立,测长,打印,删除,插入,排序,逆置
- 单链表的建立,测长,打印,删除,插入,排序,逆置
- 单链表的建立、测长、打印、删除节点、插入节点
- 实现一个单链表的建立、测长、打印、删除、插入
- 实现双向链表的创建、测长、打印、插入、删除
- 单链表的创建,表长,插入,查找,逆置,中间元素,删除节点,打印
- 带头结点单链表的基本操作(创建、测长、打印、插入、删除、取值、合并、排序、逆置)
- 单链表的创建,删除,插入以及打印。
- 双链表的建立、测长、打印、删除、插入
- 双链表的创建、删除、插入及打印(数据结构)
- 链表的创建,打印,测长,删除,排序
- UML概念及其解释
- 字典树 hdu 4287
- HDU 4730 We Love MOE Girls
- CSR1000V在XenServer的安装和简单使用
- OC中方法与函数的区别
- 自整的面试题目及代码---单链表的创建、测长、打印、删除、插入
- 关于string.t_str()
- 数码管比段_宏定义
- XMemcachedUtil
- 网络中数据传输过程的分析
- AngularJS中使用ng-repeat的index
- 读书笔记:关于wsgi、web框架和模板的总结(python)
- sqlserver完整备份一个新库的方法
- HDU 1283 最简单的计算机