数据结构----单链表

单链表的基本使用

单链表的相关函数放在LinkList.h头文件中

/*
*单链表的实现与操作 
优点:不需要预先确定数据元素的个数
缺点:空间单元利用率不高 
*/

/*==================单链表结构体=============================*/ 
typedef struct Node{
	DataType data;	//数据域 
	struct Node *next;	//指向下一个结点的指针 
}SlNode;

/*=================初始化单链表================================*/
void ListInitiate(SlNode **head){	//这里需要设计成指针的指针类型,不然得不到head的具体值 
	*head = (SlNode*)malloc(sizeof(SlNode));	//申请一个带头结点的空间,head指向其首地址 
	(*head)->next = NULL; 
}

/*============计算单链表长度=====================================*/
int ListLength(SlNode *head){
	SlNode *p = head;	//p指向头指针
	int size = 0;	
	while( p->next!=NULL ){	//循环计数 
		p = p->next;
		size++;	//经过的结点个数,即长度 
	} 
	return size;
}

/*================单链表的插入操作==================================*/
int ListInsert(SlNode *head, int i, DataType x){
	SlNode *p,*q;
	int j = -1;
	p = head;
	while( p->next!=NULL && j<i-1 ){	//让p指针指向第i-1个结点
		p = p->next;
		j++;
	}
	if( j!=i-1 ){
		printf("插入位置i参数错误!\n");
		return 0;
	}
	q=(SlNode*)malloc(sizeof(SlNode));	//生成新节点
	q->data = x;	//q的数据域为x
	/*插入操作*/
	q->next = p->next; 
	p->next = q;
	return 1; 
} 

/*====================删除链表的第i个元素,并用x接收=====================*/
 int ListDelete(SlNode *head, int i, DataType *x){	
 	SlNode *p, *s;
 	int j;
 	p = head;	//p指针指向第一个结点位置 
 	while(p->next!=NULL && p->next->next!=NULL&& j<i-1){	//不断的向下寻找,找到i-1个结点 
 		p = p->next;	//p指针向下一个结点移动 
 		j++;	//记录移动到第几个位置 
 	}
 	if(j!=i-1){	//没有找到这个位置 
 		printf("删除位置i错误!\n");
 		return 0;
 	} 
 	s = p->next;
 	*x = s->data;
 	p->next = p->next->next;	//删除
	free(s);
	return 1;
 }
 
 /*================获取链表中第i个位置的元素,用x接收===========================*/
 int ListGet(SlNode *head, int i, DataType *x){
 	SlNode *p;
 	int j;
 	p = head;	//从头结点开始 
 	j = -1;
 	while( p->next !=NULL &&j<i){	//依次向下寻找,直到找到第i个位置 
 		p = p->next;	//向下依次移动 
 		j++;	//记录移动到哪一个位置 
 	}
 	if( j!=i){	//没有找到这个位置 
 		printf("位置参数i错误!\n");
 	}
 	*x = p->data;	//获取到第i个位置的数据域内容 
 	return 1;
 }
 
/*===============================销毁单链表=================================*/
void Destroy(SlNode **head){
	SlNode *p, *p1;
	p = *head;	//从首位置开始 
	while( p!=NULL ){
		p1 = p;
		p = p->next;	//向下依次移动,并回收空间 
		free(p1);
	} 
	*head = NULL;	//最后置头指针为NULL 
}

测试代码

#include <stdio.h>
#include <malloc.h> 

typedef int DataType;	//定义DataType为int类型 
#include "LinkList.h"

int main(void){
	SlNode *head;
	int i, x;
	ListInitiate(&head);	//初始化链表 
	printf("\n\n***************************************线性表初始化数据**********************************************\n");
	for(i=0; i<10; i++){
		ListInsert(head, i, i+3);
	}
	for(i=0; i<ListLength(head); i++){
		ListGet(head,i,&x);
		printf("第%d个位置:%d ",i+1,x);
	}
	printf("\n\n************************************删除第4个位置的元素*************************************************\n");
	ListDelete(head,4,&x);
	for(i=0; i<ListLength(head); i++){
		ListGet(head,i,&x);
		printf("第%d个位置:%d ",i+1,x);
	}
	Destroy(&head);
	printf("\n");
	system("pause");
	return 0;
}

测试运行图
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值