C语言难点总结(二)----链表

标签:
c语言链表通讯簿通讯录 |
分类: IT技术 |
这篇文章主要介绍带头节点的链表:
===================================================================
===================================================================
http://s8/middle/66ec4d66g8a7278fda377&690链表的产生弥补了数组的诸多缺点,比如,数组在添加新元素时,如果添加的位置是数组的首部或者数组中间,那么,程序员不得不设计算法移动数组的相关元素,而且往往涉及的相关元素很多;再比如从数组中删除一个元素,如果删除的不是尾部元素,那么同样会去移动其他元素,从而大大影响程序的整体效率,正基于此,链表才得以应运而生,不过链表也有先天的缺陷和短处,在搜索或随机读写内部元素的时候就远远不如数组了,所以使用时要因地制宜,对症下药。
上一段说了链表比数组在添加删除元素的时候具有优越性,那么为什么具有这些优越性呢?请看下图:
http://s9/middle/66ec4d66g8a73b257f998&690=============================================================
根据上图如果要删除符合条件的节点(删除q所指节点)
1、首先找到要删除节点的前驱节点
2、用q指向要删除的节点
3、p->next = q->next;
4、free(q);
===================================================================
下图为给链表添加节点的示意图:
http://s5/middle/66ec4d66g743ec62b7a74&690==================================================================
根据上图所示,在第i个节点之前插入一个节点:
1、首先查找第i-1个节点
2、给新节点分配空间q =(Node*)malloc(sizeof(Node));给q数据域赋值。
3、q->next = p->next;
4、p->next = q;
==================================================================
上面是对链表原理的解释和说明,下面通过完整的代码来说明:
==================================================================
题目要求如下:
用链表实现通讯录的功能,要求:
1、创建具有头节点的链表通讯录。
2、可以从链表通讯录尾部插入节点(为初学者方便起见)。
3、可以删除指定的节点信息。
4、可以遍历链表通讯录的所有节点。
==================================================================
下图为项目的文件结构:
http://s10/middle/66ec4d66g8a73faeb8979&690==================================================================
//文件名:notebook.h
#ifndef NOTEBOOK_H
#define NOTEBOOK_H
#define KNAME_SIZE 20
#define KPHONE_NUMBER_SIZE 12
typedef int BOOL;
typedef struct notebook
{
}noteBook;
//创建链表
extern noteBook *createBook(void);
//从链表尾部插入数据
extern BOOL insertRecord(noteBook *aHead, char *aName, char *aPhoneNumber);
//从链表中删除节点,删除纪录时指定该条记录的名字
extern BOOL deleteRecord(noteBook *aHead, char *aName);
//遍历链表
extern void showBook(noteBook *aHead);
//销毁链表
extern void destroyBook(noteBook *aHead);
#endif
===================================================================
===================================================================
//文件名:notebook.cpp
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "notebook.h"
#define TRUE
#define FALSE 0
//创建链表
noteBook *createBook(void)
{
}
//从链表尾部插入数据
BOOL insertRecord(noteBook *aHead, char *aName, char *aPhoneNumber)
{
}
//从链表中删除节点,删除纪录时指定该条记录的名字
BOOL deleteRecord(noteBook *aHead, char *aName)
{
}
//遍历链表
void showBook(noteBook *aHead)
{
}
//销毁链表
void destroyList(noteBook *aHead)
{
}
===================================================================
===================================================================
//文件名:demo.cpp
#include <stdio.h>
#include <stdlib.h>
#include "notebook.h"
int main(void)
{
}
===================================================================
以上程序说明了,链表程序的一般写法和一般使用方法,其中关于插入纪录的方法还有更多发挥空间,希望我的文章可以抛砖引玉。
前一篇:我的手机历险记
后一篇:C++书籍推荐和学习重点