单向链表详解(C语言)

链表是一种常见的基础数据结构, 主要涉及了结构体指针(指针可以理解为地址,存的就是某个地址)。
一.链表说明:
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
*/

好了,这就是链表的基本操作了,在博客与代码中可能存在各种问题(比如代码不规范,注释不规范啥的,毕竟写的博客不多也很生疏),感谢大家纠正了。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值