链表建立、删除、插入基本操作
2013-07-29 12:05
357 查看
在数据结构中,链表无疑是最基本的,也是在大多数IT公司面试笔试中考察最多的;有了扎实的处理链表的基础,对以后学习更复杂的数据结构类型是很有帮助也是很有必要的;因此在闲暇时间中,又再一次重写了对于链表的一些基本操作,也参考了一些资料,在此将代码分享一下,希望对初学者有所帮助。
一开始的时候,对于链表的建立,都会这样来写,基本上都会用到两次malloc函数的调用。代码大致上如下所示。
后来看了一些资料,简化了很多,下面这种写法值得提倡:
然后要提到的就是插入和删除的操作了:有两点要注意:首先不论是插入还是删除第一要做的就是找到要操作的那个位置;其次要把操作的位置分三种情况,即头结点、中间结点、尾结点。
下面的代码参考了一些资料(如程序员面试宝典、谭浩强的书)
插入结点
删除结点:(可以将尾结点和中间结点步骤合二为一)
最后简单再介绍一下链表排序,链表排序,重点在排序,对指针的操作少;而排序用到的无非就是几种经典的排序算法,如冒泡、直接、选择等等。通过我个人的经历来看,排序对于面试笔试来说也是个重点,几乎都能被问到。
以下是一个用冒泡法写的一个链表排序
一开始的时候,对于链表的建立,都会这样来写,基本上都会用到两次malloc函数的调用。代码大致上如下所示。
//创建长度为n的单链表 node *create(int n) { node *head,*precious,*current; int cnt; int label = 1; for(cnt = 0;cnt < n;cnt++) { if(label == 1) { precious = (node *)malloc(sizeof(node)); printf("Input the information just like:name ID gender age \n"); scanf("%s%s%s%d",precious->name,precious->ID,precious->s,&precious->age); precious->link = NULL; head = precious; label = 0; } else { current = (node*)malloc(sizeof(node)); printf("Input the information just like:name ID gender age \n"); scanf("%s%s%s%d",current->name,current->ID,current->s,¤t->age); // current->link = NULL; precious->link = current; precious = current; } } precious->link = NULL; return head; }
后来看了一些资料,简化了很多,下面这种写法值得提倡:
//建立链表 node *CreatLink(int n) { node *head,*p,*q; for(int i=1; i<n+1; i++) { p = (node*)malloc(sizeof(node)); printf("input a number:"); scanf("%d",&p->data); if(i == 1) head = p; else q->next = p; q = p; p->next = NULL; } return head; }
然后要提到的就是插入和删除的操作了:有两点要注意:首先不论是插入还是删除第一要做的就是找到要操作的那个位置;其次要把操作的位置分三种情况,即头结点、中间结点、尾结点。
下面的代码参考了一些资料(如程序员面试宝典、谭浩强的书)
插入结点
node *Insert(node *head,int num) { node *p,*q,*s; s = (node*)malloc(sizeof(node)); printf("input a number:"); scanf("%d",&s->data); p = head; //先寻找到相应位置再处理,假设数据已按升序排列 while(p->data < s->data && p->next != NULL) { q = p; p = p->next; } if(p == head) {head = s; p = s->next;} else if(p->next == NULL) { p->next = s; s->next = NULL; } else { q->next = s; s->next = p; } return head; }
删除结点:(可以将尾结点和中间结点步骤合二为一)
node *Delete(node *head,int num) { node *p,*q; p = head; //先查找再删除 while(p->data != num && p->next != NULL) { q = p; p = p->next; } if(num == p->data) { if(p == head) { head = p->next; free(p); } else { q->next = p->next; free(p); } } else printf("%d could not been found",num); return head; }
最后简单再介绍一下链表排序,链表排序,重点在排序,对指针的操作少;而排序用到的无非就是几种经典的排序算法,如冒泡、直接、选择等等。通过我个人的经历来看,排序对于面试笔试来说也是个重点,几乎都能被问到。
以下是一个用冒泡法写的一个链表排序
node *Sort(node* head,int length) { node *p; for(int i = 1; i < length ; i++) { p = head; for(int j = 0; j < length - i ; j++) { if(p->data > p->next->data) { int tmp = p->data; p->data = p->next->data; p->next->data = tmp; } p = p->next; } } return head; }
相关文章推荐
- 程序员面试宝典_链表基本操作,建立,求长,删除和插入特定值的结点
- 链表基本操作(建立、修改,插入、删除、打印)
- 链表的基本操作(C语言版):建立,插入,删除,查找,输出
- 单链表的基本操作:建立,求长度,输出,排序,插入,删除,逆置
- 链表的基本操作,建立,测长,删除,打印,插入
- 单向链表的基本操作-创建、插入、删除
- 链表(单双链表)用法与基本操作(构建、查找、插入、删除)实现
- 链表的一些基本操作:动态链表、插入和删除等
- Java实现单链表插入删除等基本操作
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 编程实现顺序存储结构和链式存储结构线性表的建立、查找、插入、删除等基本操作
- 用C语言编写一个包含链表的初始化、插入、删除、查找等基本操作的程序。
- C_线性表----单链表的基本操作(构表、插入、删除、倒序、输出)
- c++之链表篇1:单向链表的创建,打印,删除,插入,销毁等基本操作
- 链表的基本操作之插入、删除、逆置
- 数据结构链表的操作集合(建立,遍历,插入,删除,排序,长度,空判断等)
- 猴子选大王改编;关于环形链表的建立,删除,插入操作演示
- 【程序员面试宝典】数据结构基础二单链表循环链表的操作 建立|插入删除|打印|合并
- 单链表结点读取、插入、删除操作(基本操作)-C++
- 数据结构之循环链表操作3-(合并,拆分,插入,删除,建立等)