链表是一种常见的基础数据结构, 主要涉及了结构体指针(指针可以理解为地址,存的就是某个地址)。
一.链表说明:
1.可以动态的进行存储分配
2.链表其实就是一连串的结构体指针(这些结构体指针指向了malloc函数分配的内存中)组成,一个结构体指针我们就把它叫做一个节点,在结构体中就可以定义多种数据类型。
二.链表组成
1.一个头指针,一般以head来表示,存放的是一个地址
2.每个节点都分为两部分,一个数据域,一个是指针域
3.最后一个元素不再指向其它元素,它的指针一般指向“NULL”(表示“空地址”),表示链表到此结束
如图所示,链表由一个头指针,很多个节点,还有尾指针组成。
每一个节点从中间分为了两半,可以理解为每一个节点含两部分一是数据二是指针,指向下一个节点的指针
三.链表的创建及其基本操作
1.链表的创建
#include <stdio.h>
#include <malloc.h> //因为下面要用到malloc函数,所以引用其头文件,不熟悉malloc函数可以上网查一下
typedef struct Node{ //定义了Node结构体,其中包含数据number(number是其中的数据而已,可以随便存合适数据)与指针pNext
int number;
struct Node* pNext; //在结构体数组中定义了结构体指针,指向下一个结构体的地址(现在还没赋值)
}Node,*pNode; //这里的意思是以后我们写struct Node可以直接写为Node,struct Node* 可以写为*pNode
这就完成了结构体的定义了,接下来开始创建一个链表。
pNode c(){ //定义了这个c()函数,返回一个结构体指针(其实这个指针就是头指针,我们知道头指针就可以通过关系得到这个链表了)
int a[5]={6,10,9,5,8};
pNode pHead=(pNode)malloc(sizeof(Node)); //定义了pHead(结构体指针),并分了内存,它其实也含有数据,但只是没赋值
pNode pTail=pHead; //pTail与pHead现在是指向相同的地址
pTail->pNext=NULL;
pHead->pNext=NULL;
for(int i=0;i<5;i++) { //这里相当于创建了五个节点(意思是实打实的数据)
pNode pNew=(pNode)malloc(sizeof(Node)); //分配一块内存空间,这个结构体指针pNew指向它
pNew->number=a[i];
pTail->pNext=pNew; //pTail的pNext指向了pNew意思是pTail的pNext指向了pNew这个框框(地址),这里pTail与pHead是指向的同一地址,改变了pTail->pNext也相当于改变了pHead->pNext,这是为什么没有出现对pHead->pNext赋值
pNew->pNext=NULL; //pNew是最后一个框框,它的pNext指向了NULL
pTail=pNew; //pTail指向的地址与pNew指向的地址一样了,pTail就是最后一个框框
}
return pHead;
}
2.链表的遍历
void TraverseList(pNode pHead) {
pNode p=pHead->pNext;
while(NULL!=p) { //最后一个框框的指针是NULL
printf("%d ",p->number);
p=p->pNext; //结构体指针向下一个移动
}
printf("\n");
}
3.链表的插入(插入一个新的链表)
void insert(pNode pHead,int front,int data) { //front就是要插入新链表的位置,data是插入新链表中number的值
int i=0;
pNode pNew=(pNode)malloc(sizeof(Node));
pNode position=pHead;
while(i<front-1) {
position=position->pNext;
++i;
}
pNew->pNext=position->pNext; //插入链表时先用新的链表的pNext指向下一个链表,再用新链表的上一个pNext指向新链表,顺序不能反了
position->pNext=pNew;
pNew->number=data;
}
4.链表的删除
void deleteNode1(pNode pHead,int n) { //n表示要删除哪一个
int j=0;
pNode pre=pHead;
pNode p;
while(pre->pNext&&j<n-1) {
pre=pre->pNext;
j++;
}
p=pre->pNext;
pre->pNext=p->pNext; //删除那个框框就是把它的上一个框框的pNext指向它后面的框框并把自己释放的过程
free(p);
}
5.附上这几个函数的主函数
int main() {
int position;
int mum;
pNode pHead=NULL;
pHead=c();
TraverseList(pHead);
printf("请输入插入位置:"); //插入节点
scanf("%d",&position);
printf("输入数据:");
scanf("%d",&mum);
insert(pHead,position,mum);
TraverseList(pHead);
printf("请输入删除位置:"); //删除节点
int number;
scanf("%d",&number);
deleteNode1(pHead,number);
TraverseList(pHead);
}
/*
再加上运行示例
6 10 9 5 8
请输入插入位置:3
输入数据:20
6 10 20 9 5 8
请输入删除位置:2
6 20 9 5 8
*/
好了,这就是链表的基本操作了,在博客与代码中可能存在各种问题(比如代码不规范,注释不规范啥的,毕竟写的博客不多也很生疏),感谢大家纠正了。