线性表的概念以及链表之C(用函数操作)与C++(用类操作)分别实现的总结

一、线性表的概念
1、线性表是线性结构的典型代表
2、线性表是一种最基本、最简单的数据结构,数据元素之间仅具有单一的前驱和后继关系
3、线性表是贯穿数据结构课程的基本技术

二、线性表的逻辑结构
线性表中的数据与数据之间的逻辑关系是前驱和后继的关系

三、线性表的存储结构
(一)顺序存储结构——顺序表
就是通常的一维数组来实现,但是存储的数据元素个数要小于数组的长度,这样就防止在增删操作时数据元素不会溢出

(二)连接存储结构——链表
(1)单链表
单链表实现的关键:
1、创建一个空/有序链表;2、创建一个新的结点;3、将结点放入到链表当中 4、对结点进行增删改查的操作同时保证链表的完整性

假设一个例子,要求实现学生信息的管理系统,结构体已经给出:

typedef struct StudentNode{
    
    
	char score[20];
	char name[30];
	char num[15];
	char tel[15];
	char e_mail[30];
	char adds[50];
	struct StudentNode* next;
}Student,*Link;

1)用C实现链表
1、创建一个链表

//创建链表
Link createlist(){
    
    
	Link headnode = (Link)malloc(sizeof(Student));//动态分配存储空间
	headnode->next = NULL;      //初始化为空链表
	return headnode;
};

2、如何创建一个结点

//创建节点
Link CreateNode(char score[20],char name[31],char num[15],char tel[15],char e_mail[30],char adds[50]){
    
    
	Link NewNode = (Link)malloc(sizeof(Student));//为每一个结点分配一个存储空间
	strcpy(NewNode->score,score);
	strcpy(NewNode->name,name);
	strcpy(NewNode->num,num);
	strcpy(NewNode->tel,tel);
	strcpy(NewNode->e_mail,e_mail);
	strcpy(NewNode->adds,adds);
	NewNode->next = NULL;
	return NewNode;
} 

3、插入结点到链表中
①头插法

Link newNode = CreateNode(score,name,num,tel,e_mail,adds);
	newNode->next = headnode->next;     
	headnode->next = newNode;

②尾插法
注意:尾插法不同于头插法,头插法可以间断的输入数据;而尾插法需要一次性输入要输入的所有数据,且需要用循环输入,因为尾指针它要一直指向尾部,如果间断输入,那么每实现一次调用尾插的语句,就要先循环将尾指针指向尾部

Link newnode = CreateNode(score,name,num,tel,e_mail,adds);
		newnode->next = NULL;
		rearnode->next = newnode;
		rearnode = newnode; 

4、实现其他的函数操作
后续所有的函数的()内都必须传入Link headhode,即将链表的表头告诉那个函数

2)用C++(用类操作)实现链表
两种方法实现的区别:
1、C++用类实现的方式比C用函数实现的方式要方便些
2、C用函数实现时,所有的功能函数(除创建节点和链表)外都需要引入头结点的参数,知道链表的存在;而C++用类实现时不需要这样做
3、C用函数实现时创建节点和插入节点分别在两个函数当中;而C++用类实现时只需要在插入节点中创建一个节点,或者在构造函数中创建节点即可

class LinkStudent{
    
    
	private:
		StudentNode* first;
	public:
		LinkStudent();
		~LinkStudent();
	public:
		void add_person(StudentNode stu);
		void correct_info(char name[]);
 		void delete_info(char name[]);
		void searchbyname_person(char name[]);
		void searchbytele_person(long int tele);
		void insert_person(StudentNode stu1);
		void print_team();
		int length(); 
};

1、创建一个链表

LinkStudent::LinkStudent(){
    
    
	first = new StudentNode;
	first->next = NULL;
}

2、删除一个链表

LinkStudent~::LinkStudent(){
    
    
	while(first != NULL){
    
    
		StudentNode p = first;
		first = first->next;
		delete p;
	}
	delete first;
}

3、创建一个节点
C++用类实现时,可以直接在插入函数里面创建一个结点,然后赋值进去,插入到链表当中
(2)循环链表
在单链表中,将终端节点的指针域由空指针改为指向头结点,使得整个链表成为一个环即可
(3)双链表
在单链表的每个节点中再设置一个指向其前驱节点的指针域,就形成了双链表

(三)顺序表和链表的比较
1、时间性能比较
若是线性表需要频繁查找却很少进行插入和删除操作时,或使其操作和“数据元素在线性表中的位置”密切相关时,宜采用顺序表;
若是需要频繁进行插入和删除操作,宜采用链表
2、空间性能比较
存储密度 = 数据域占用的存储量/整个结点占用的存储量
顺序表的存储密度为1;链表则不为1
当线性表中元素个数变化较大或未知时,最好采用链表;若事先知道线性表的大致长度,使用顺序表效率跟高
(四)顺序表的其他存储方法
1、静态链表
之前讲的都是动态链表
静态链表是用数组来表示单链表,用数组元素的下标来模拟单链表指针,其中的每个数组元素由两个域组成:数据域和指针域。其中指针域存放该数组元素的后继元素所在得数组下标
2、间接寻址
间接寻址是将数组和指针结合起来的一种方法,它将数组中的存储数据元素的单元改为存储指向该元素的指针

猜你喜欢

转载自blog.csdn.net/Cristiano_san/article/details/106622458