定义
线性结构,不连续,由值域与指针域组成
具体组成
- 头指针:指向头结点的指针,可以说有了一个头指针就有了一个链表
- 头结点:没有有效值,有指向首结点的指针,用途我没有感觉到,但肯定很有用
- 首结点:有有效值的第一个结点
- 尾结点:只有有效值,没有指针
- 尾指针:指向为结点,最没有存在感
实例说明
和昨天的一样用一个例子来总结所有的用法,因为昨天说过,所以一些基础就不再赘述。见数据结构之数组
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
//开始创建一个节点
typedef struct Node{
int date;//数据域
struct Node* pnext;//指针域
}node,*pnode;
//声明函数功能
pnode create();//创建链接
void bianli(pnode phead);//遍历
bool is_empty(pnode phead);
void sort(pnode phead);//排序
void delete_link();//删除,我没有写下去,复习的时候独立写出
int len(pnode phead);//计算长度
bool insert(pnode phead, int pos, int val);//插入
int main(void){
pnode phead = NULL;//先创建头指针,头指针是链表的唯一条件
phead = create();//返回一个头指针的地址就搞定了一个链表
bianli(phead);
if(is_empty(phead) ==false){
printf("不为空\n");
}
printf("长度为 %d",len(phead));
printf("-------------------------------\n");
sort(phead);
bianli(phead);
return 0;
}
pnode create(){
int len;//用来记录有多少个节点
int i;
int val;//用来储存临时节点的值
printf("输入您想要的节点个数,len = \n");
pnode phead = (pnode)malloc(sizeof(node));//创建一个头指针
if(NULL ==phead){//一般的内存地址分配失败结果就会为空
printf("分配失败");
exit(-1);
}
pnode ptail = phead;//创建的尾巴主要为了保证每个节点的末尾都是下一个节点的地址
ptail->pnext = NULL;//对于下一个未知节点就先令其为空
scanf("%d ",&len);
for(i = 0;i<len;i++){
printf("请输入第%d个节点的值\n",i+1);
scanf("%d",&val);
pnode pnew = (pnode)malloc(sizeof(node));
if(NULL ==pnew){
printf("分配失败");
exit(-1);
}
pnew->date = val;//对于一个新的节点,先前半部分赋值
ptail->pnext = pnew;//赋值上一个节点的后半部分地址
pnew->pnext = NULL;//新的节点的后半部分先空着
ptail = pnew;//尾巴右移
}
return phead;
}
void bianli(pnode phead){
int i = 0;
pnode p = phead->pnext;
for(i;p !=NULL;i++){
printf("第%d个值为%d\n",i+1,p->date);
p = p->pnext;
}
}
bool is_empty(pnode phead){
if(phead->pnext ==NULL){
return true;
}
else
return false;
}
int len(pnode phead)
{
int i = 0;
pnode p = phead->pnext;
for(i;p !=NULL;i++){
//printf("第%d个值为%d\n",i+1,p->date);
p = p->pnext;
}
return i;
}
//整个排序的代码与正常的数组的一样,这好像可以理解为c的泛型
void sort(pnode phead){
int i = 0, j,t;
int le = len(phead);
pnode p, q;
for(i,p = phead->pnext;i<le-1;i++,p = p->pnext){//注意循环量不仅要++,而且要链接的跟进
for(j = i+1,q = phead->pnext;j<le;j++,q = q->pnext){
if(p->date > q->date){
t = p->date;
p->date = q->date;
q->date = t;
}
}
}
}
//其实下面的代码有点难度理解,建议配合郝斌老师的视频来理解,然后自己动笔画一画,我尽力讲解
bool insert(pnode phead, int pos, int val){
int i = 0;
pnode p = phead;//首先要定位要插入的位置
while(p !=NULL&& i<pos-1){//这段代码把位置定位到pos的前一个节点的指针域
p = p->pnext;
i++;
}
if(NULL = p||i>pos - 1)//可无
return false;
pnode pnew = (pnode)malloc(sizeof(node));//创造要插入的节点
if(pnew == NULL){
printf("内存分配失败");
exit(-1);
}
pnew->date = val;//以下四句就类似于交换a与b的值。只不过把a与b换成 p->pnext与pnew
pnode q = p->pnext;
p->pnext = pnew;
pnew->pnext = q;
return true;
}