上一节还遗留一些知识点(比如说动态实现删改查),但是不重要,有了之前动手操作练习的基础,实现会很快,这里就直接略过。 前面两节主要说了线性表结构中的数据元素之间的关系,这一节将会介绍关于单链表结构中的数据元素之间的关系 单链表:顾名思义就是像链条一样,两个数据元素紧紧扣在一块。在数组中的定义如下(这里依旧使用最简单的int类型作为数据元素类型)
#include "stdio.h"
#include <malloc.h>
typedef struct list
{
??? //为了简化操作:数据元素简单认为是int类型
??? int data;
??? int length;//这个单链表中元素的个数
??? struct list *next;
}lnode,*linklist;
上面就创建了一个最简单的单链表(这里的单链表其实也就是指一个节点),值得注意的是:
单链表按照定义应该是一个节点不仅仅包含数组元素本身,还应该由指向下一个节点的指针
struct list *很自然的就明白是指向下一个节点。在结构体中定义可以直接赋值指向那个节点。为了方便后续操作,还要在结构体外进行定义一个头节点(*linklist),后面就用linklist来表示链表的头节点.
一定一定要注意好对应关系
Linklist可以是一个头节点,节点不一定是Linklist
#include "stdio.h"
#include <malloc.h>
typedef struct node
{
??? //为了简化操作:数据元素简单认为是int类型
??? int data;
??? struct node* next;
}lnode, * linklist;
linklist listinsert1(linklist& l, lnode *data) {//链表,需要连接的节点
??? l->next = data;
??? data->next = NULL;
??? return l;
}
void listinsert2(lnode *data1, lnode *data2) {//节点,需要连接的节点
??? data1->next = data2;
??? data2->next = NULL;
}
int main() {
??? //链表初始化
??? lnode node1;
??? node1 = { 1,NULL };
??? //这个节点是一个头节点
??? linklist linklist1 = &node1;
??? //定义新节点
??? lnode *node2 = (lnode*)malloc(sizeof(lnode));
??? *node2 = { 23,NULL };
??? linklist1 = listinsert1(linklist1, node2);//传入的必须是指针
??? //第三次测试
??? lnode *node3 = (lnode*)malloc(sizeof(lnode));
??? *node3 = { 5,NULL };
??? listinsert2(node2, node3);//传入的必须是指针
??? //实现单链表的增
??? printf("linklist1->data=%d\n", linklist1->data);
??? printf("linklist1->data->data=%d\n", linklist1->next->data);
??? printf("linklist1->data->data->data=%d\n", linklist1->next->next->data);
??? printf("OK");
}
后面如果想实现后插就可以直接定义一个lode
然后让上一个节点的指针指向它即可。
附录1
注意:在函数中如果想修改某个值,要么用参数是引用,要么传入用指针
线性表的其他形式
前面说过顺序表还有单链表,顺序表给从无到有建立了基础,而单链表则是又一大难题。其他两种-双链表和循环链表实现的代码其实上面两种形式就已经算是一种原型了,对于这两种结构,这里就简单的提一嘴。 这就是双链表:
在代码中只要添加一个指针即可
这就是循环链表
只是在最后一个数据元素中添加头指针的地址即可 线性表就准备写到这里了,不是不想扩充,而是因为前期敲代码花了很多时间,一章寻思寻思就花了一下午。
|