数据结构代码1
2013-10-10 21:43
561 查看
#include<stdio.h> #include<stdlib.h> struct list{ int a; list *next; }; list * node() { return (list *)malloc(sizeof(list)); } int main() { list *l = node(); return 0; }
#include<stdio.h> #include<stdlib.h> struct list{ int a; struct list *next; }; struct list * node() { return (struct list *)malloc(sizeof(struct list)); } int main() { struct list *l = node(); return 0; }
单链表带头结点&不带头结点 Node *head; //声明头结点 带头结点初始化 void InitList(Node **head){ *head=(Node *)malloc( sizeof(Node)); (*head)->next=NULL; } 带头结点尾插入,统一操作 方式一: void CreatList(Node **head){ Node *r=*head,*s; int a; while(scanf("%d",&a)){ if(a!=0){ s=(Node *)malloc(sizeof(Node)); s->value=a; r->next=s; r=s; } else{ r->next=NULL; break; } } } 调用CreatList(&head); 方式二: void CreatList(Node *head){ Node *r=head,*s; ... //下面的都一样 } 调用CreatList(head); ------------------------------------------------------------------------------------------------------ 不带头结点初始化 方式一: void InitList(Node **head){ *head=NULL; } 调用InitList(&head); 方式二: void InitList(Node *head){ head=NULL; } 调用InitList(head); 不带头结点尾插入,第一个节点与其他节点分开操作 void CreatList(Node **head){ Node *p,*t; /*p工作指针,t临时指针*/ int a,i=1; while(scanf("%d",&a)){ if(a!=0){ t=(Node *)malloc(sizeof(Node)); t->value=a; if(i==1){ *head=t; } else{ p->next=t; } p=t; } else{ p->next=NULL; break; } i++; } } 调用CreatList(&head); 一、两者区别: 1、不带头结点的单链表对于第一个节点的操作与其他节点不一样,需要特殊处理,这增加了程序的复杂性和出现bug的机会,因此,通常 在单链表的开始结点之前附设一个头结点。 2、带头结点的单链表,初始时一定返回的是指向头结点的地址,所以一定要用二维指针,否则将导致内存访问失败或异常。 3、带头结点与不带头结点初始化、插入、删除、输出操作都不样,在遍历输出链表数据时,带头结点的判断条件是while(head->next!=NULL), 而不带头结点是while(head!=NULL),虽然头指针可以在初始时设定,但是如1所述,对于特殊情况如只有一个节点会出现问题。 二、为什么不带头结点初始化有2种方式,而带头结点只有1种方式呢? 因为不带头结点声明Node *head 时;C编译器将其自动初始化为NULL,于是根本不需要调用InitList(head);也即不带头结点的初始化 是个伪操作。而带头结点的初始化在堆开辟了一段内存,需要修改head指针变量指向的地址(即head的值),所以要修改head的值,必须传保 存head变量的地址(即二维指针)。而直接调用CreatList(head);相当于传head变量的值,函数修改的是head的副本,无法真正改变head的值。 注:这里可以将head指针看成一个变量(不管它保存的是地址),就比较好理解了。 三(key)、其实本质上还是传值,传址的问题,只不过指针本身保存的地址,让这个过程变得有点纠结。在函数调用需要修改指针变量的指向(value)时, 应该传递指针变量的地址(address)。 另外,对于函数的形参是指针时,只要该参数不在左边(即都是右值操作),二维指针(形参)就可以简化为一维指针。如上面带头结点的尾插 简化版本。
相关文章推荐
- 树的三种遍历方法代码实现 (数据结构)C语言
- 40道数据结构编程题及代码合集
- 4000 《数据结构》(严蔚敏)算法代码实现第二章
- 数据结构第二章线性表---课本代码
- 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。o(1)空间的代码实现
- 《数据结构》 定长顺序串常用操作代码集合
- 数据结构 - 归并排序(merging sort) 详解 及 代码
- 程序员代码面试指南:IT名企算法与数据结构题目最优解-字符串问题:C/C++语言实现
- 数据结构 - 希尔排序(Shell's Sort) 详解 及 代码(C++)
- 代码整洁之道----对象和数据结构
- 【数据结构】堆栈(顺序栈、链栈)的JAVA代码实现
- 经典面试题(四)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 数据结构 - 快速排序(Quick Sort) 详解 及 代码(C++)
- 算法与数据结构-栈与队列 讲解与java代码实现
- 程序员代码面试指南:IT名企算法与数据结构题目最优解
- 数据结构中的线性表代码实现
- 数据结构(Java ArrayList模拟)本代码重在学习数据结构思路,代码完整性欠缺,请见谅
- 数据结构 - 队列简介 及 1个简单的c语言链式队列代码实现
- Android JNI 使用的数据结构JNINativeMethod详解 ||建立Android SDK下的JNI、JAVA应用完整步骤---Android JAVA调用C++代码
- [经典]技术面试宝典: 很全面的算法和数据结构知识(含代码)