Data Structure 初学链表(ADT实现)
来源:互联网 发布:淘宝论坛帐号 编辑:程序博客网 时间:2024/06/05 20:21
通过c语言实现最原始的链表(输入的链表指定输入的个数,至于无限输入请往下翻),顺便复习一下c语言的语法。
①按照ADT的实现,把链表的实现划分为许多功能。
#include<stdio.h>#include<stdlib.h>typedef struct LNode{ int elem; struct LNode *next;}LNode, *LinkedList;void IntiList(LinkedList *);//初始化链表int LocateElem(LinkedList ,int target);//从链表中寻找与target相等的数字,并返回该数字的位序void DestroyList(LinkedList *);//释放链表所占用的内存
其中typedef语句中的*LinkedList是什么意思呢?
其实就是struct LNode *等价于LinkedList。
headNode是头指针,指向头结点,头结点没有设置数据域,头结点接下来是第一个有数据域的节点。
②接下来给出程序的主体
int main(void){ LinkedList headNode; headNode = (LinkedList)malloc(sizeof(LNode)); IntiList(headNode);//传递指针 int index,target; scanf("%d",&target); index = LocateElem(headNode, target); printf("%d",index); DestroyList(&headNode);//传递指针的指针 return 0;}
③下面重点看IntiList 函数的实现
我先贴出一开始我错误的做法:
void IntiList(LinkedList L){ int num,i; LinkedList temp = L; scanf("%d",&num);//决定链表有多少个节点 for(i=0;i<num;i++){ temp = temp->next; printf("%p\n",temp); temp = (LinkedList)malloc(sizeof(LNode)); printf("%p\n",temp); scanf("%d",&temp->elem); } temp->next = NULL; printf("%d",L->next->elem);//没有输出数字而是输出内存地址}
以上函数的问题出错的地方恰好就是for循环中两个printf之间的语句。因为malloc函数会分配一个全新的地址给temp,这个新的地址把temp->next这一个与之前的strcut有联系的地址给覆盖掉了,也就是说,前后的printf输出的temp的内存地址是不同的,自然新的地址与之前的struct没有联系。
那么如何解决这样的问题呢?
我们可以先malloc一个新的地址然后再把地址赋值给temp->next就可以了。
实现代码:
void IntiList(LinkedList L){ int num,i; LinkedList prev = L; LinkedList current; scanf("%d",&num);//决定链表有多少个节点 for(i=0;i<num;i++){ current = (LinkedList)malloc(sizeof(LNode)); scanf("%d",¤t->elem); prev->next = current; prev = current; } current->next = NULL;}
④LocateElem以及DestroyList函数的实现:
int LocateElem(LinkedList L, int target){ LinkedList temp = L; int i = 0; while(temp->next != NULL){ temp = temp->next; i++; if(temp->elem == target){ break; } } return i;}void DestroyList(LinkedList *L){ LinkedList temp; while(*L){ temp = (*L)->next; free(*L); *L = temp; }}
⑤最后说一下c语言的函数传递参数
c语言是按值传递的
也就是说在函数传递的时候,对传递的参数进行了浅复制。
举个例子
void a(int b);int main(void){ int c = 1; a(c); return 0;}void a(int b){}
也就是说在main函数中的c的指针与a函数的中b的指针是不一样的,如果想在a函数中修改c的值并体现在main函数中则必须传递c的指针。
所以,也就是说,如果我们想修改指针的地址时,必须传递指针的指针。
To be continued.
0 0
- Data Structure 初学链表(ADT实现)
- Data structure-4 双向链表 DoubleLinkedList--Java语言实现
- data structure 链表思想 约瑟夫环
- Data Structure?(hdu4217)
- 【data structure】线性表简单模板c++实现
- Data Structure(1)---线性表
- data structure --Queue(基于数组的实现)
- data structure--Stack(基于数组实现)
- 【Data Structure/Algorithm】LCSS算法实现
- 线性表——Data Structure(C语言描述)
- Data Structure
- Data structure
- Data Structure
- Data structure
- Data structure
- data structure
- Data Structure
- Data structure
- STL hdu1540 Tunnel Warfare
- codeforces Round 314 div.2
- 什么是Windows服务
- 关于IO的同步,异步,阻塞,非阻塞
- 百度开放云java+tomcat部署web项目-小皇帝詹姆斯
- Data Structure 初学链表(ADT实现)
- 算术符优先级
- strcpy与memcpy的区别
- 2015.08.07网络编程read()函数详解
- 在winpe里头集成virtio驱动
- Shell Scripts - 条件语句,case语句,function功能
- java中获取一天当中的毫秒数
- HDU1253 胜利大逃亡 BFS
- Java反射