C语言——单向链表的增删改查

单向链表的查找

什么是链表?
1.和数组一样,链表也是一种线性表 。
2.从内存结构来看:链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。
3.链表中的每一个内存块被称为节点Node。节点除了存储数据之外,还要记录链上 下一个节点的地址,即后继指针next。

1.查找单向链表的尾结点

利用单向链表尾结点的特点:其指针域为NULL。构建的查找函数代码如下:

PLAYER *Findlast(PLAYER *head){					//定义一个查找函数
		PLAYER *pr;
		pr=head;
		while(pr->next!=NULL)		//利用尾结点的指针域为NULL
					pr=pr->next;			//一直向后移动直至找到尾结点
		return pr;	
	}
2.查找单向链表的第n个节点

利用计数器去记录已经遍历的节点个数,查找到第n个节点后直接返回。

PLAYER *Find(PLAYER *head, int index){
			PLAYER *Pt=head;
			int i=1;
			while(i<index&&Pt!=NULL)			//限制n小于节点总数
			{
			Pt=Pt->next;
			i++;
			}
			return Pt;							//若已经找到则直接返回,没有找到则返回0;
}

单向链表的增添

1.在尾部添加一个节点
	PLAYER *insert(PLAYER *head){
		PLAYER *prePt *Pt;
		Pt=(PLAYER*)malloc(sizeof(PLAYER));
		scanf("  ",   );								//输入新增节点所包含的信息
		prePt=Findlast(head);
		prePt->next=Pt;
		prePt->next=NULL;								//使新增节点成为新的尾结点
		return head;
}
2.在第n个节点之后插入一个新的节点

让第n个节点的指针域指向新的节点,新节点的指针域指向第n+1个节点。

PLAYER *insert(PLAYER *head){
		PLAYER *prePt *Pt;
		Pt=(PLAYER*)malloc(sizeof(PLAYER));
		scanf("  ",   );							//输入新增节点所包含的信息
		prePt=FindNode(head, index)               //复制第n个节点的地址
		if(prePt!=NULL){						//判断n是否超出范围
		Pt->next=prePt->next;					//这两项顺序不能调整否则会导致新节点的指针域存储自身地址,自身成环
		prePt->next=Pt;
		}
		else	printf("将在尾部或其它未知位置插入");
		return head;
	}

单向链表的删除

让第n-1个节点的指针域直接跳过第n个节点指向第n+1个节点,要记得释放要删除的节点的内存。

PLAYER *Delete(PLAYER *head,int index){
	PLAYER *Pt=head,prePt=NULL;
	int i=0;						//直觉告诉我这个没有什么用
	prePt=Find(head,index-1);
	if(Pt!=NULL){
	prePt->next=Pt->next;
	free(Pt);					//释放Pt所占空间
	}
	else	printf("There is no node\n");
	return 0;
}

单向链表的修改

先删除指定的节点然后在原位置上增加新节点

PLAYER *Replace(PLAYER *head, int index){
	PLAYER *Pt=head,prePt=NULL,*old,*new;
	int i=0;					
	prePt=Find(head,index-1);
	if(Pt!=NULL){
	prePt->next=Pt->next;
	free(Pt);				
	}
	new=(PLAYER*)malloc(sizeof(PLAYER));
	scanf("  ",   );							
	old=FindNode(head, index)              
	if(old!=NULL){					
	new->next=old->next;			
	old->next=new;
}

刚开始接触链表理解不够深,文字表述较少,方法较笨,如有表述不当之处请多多指教。

参考资料来源《中国大学MOOC》中的视频讲解以及“白色石头”的文字表述。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一下 C 语言中动态链表增删改查操作。 首先,我们需要定义一个链表结构体: ```c typedef struct Node { int data; struct Node *next; } Node, *LinkedList; ``` 其中,`data` 表示链表节点中存储的数据,`next` 表示指向下一个节点的指针。 接下来,我们可以实现链表的创建操作: ```c LinkedList createList() { LinkedList head = (LinkedList)malloc(sizeof(Node)); head->next = NULL; return head; } ``` 这个函数会返回一个链表头节点的指针,也就是一个空链表。 接下来,我们可以实现链表节点的插入操作: ```c void insertNode(LinkedList L, int data) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->next = L->next; L->next = newNode; } ``` 这个函数会在链表头节点后插入一个新的节点。 接下来,我们可以实现链表节点的删除操作: ```c void deleteNode(LinkedList L, int data) { Node *p = L; while (p->next != NULL && p->next->data != data) { p = p->next; } if (p->next == NULL) { printf("Not found!\n"); return; } Node *tmp = p->next; p->next = tmp->next; free(tmp); } ``` 这个函数会在链表中查找指定数据的节点,并删除它。 最后,我们可以实现链表节点的查找操作: ```c Node *findNode(LinkedList L, int data) { Node *p = L->next; while (p != NULL && p->data != data) { p = p->next; } return p; } ``` 这个函数会在链表中查找指定数据的节点,并返回它的指针。 以上就是 C 语言中动态链表增删改查操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值