单链表的实现

单链表学习整理
运行环境-Dev c++

#include<stdio.h>
#include<stdlib.h>

//构建单链表结构体
typedef struct Node{
	int data;
	struct Node *next;
}Node,*LinkList;
//创建并申请结点空间的两种方式
/*
	1、Node *p = (Node*) malloc (sizeof(Node));
	2、LinkList P = (LinkList) malloc (sizeof(Node)); 
*/ 
//初始化单链表-带头结点 
LinkList InitLink();
//创建单链表-带元素值-头插法 
void CreateLink1(LinkList &L);
//创建单链表-带元素值-尾插法
void CreateLink2(LinkList &L); 
//插入单条记录 
void InsertLink(LinkList &L,int a);
//将数据插入到链表的指定位置
void InsertLinkById(LinkList &L,int i,int a); 
//删除指定位置的单条记录 
void DeleteLink(LinkList &L,int i,int &e);
//输出整个数据 
void ShowLink(LinkList L); 
//随时记录数据个数-改变头结点的值 
void CountByHead(LinkList &L);
int main(){
	//-----头插法建立链表 
	LinkList L1 = InitLink();//初始化单链表 
	printf("输出初始化带头结点的单链表:"); 
	ShowLink(L1);
	printf("\n"); 
	CreateLink1(L1);//头插法创建单链表 
	printf("输出头插法创建的单链表:");
	ShowLink(L1);//输出链表数据 
	printf("\n");
	
	//-----尾插法建立链表 
	LinkList L2 = InitLink();//初始化单链表 
	CreateLink2(L2);//尾插法创建单链表 
	printf("输出尾插法创建的单链表为:");
	ShowLink(L2);//输出链表数据 
	printf("\n");
	
	//---单链表的插入 
	int a;
	printf("输入插入的数据值为:");
	scanf("%d",&a); 
	InsertLink(L2,a);//将a值插入到链表的表尾 
	printf("输出插入后的单链表为:");
	ShowLink(L2);//输出链表数据
	printf("\n");
	
	//---指定位置下插入一条记录
	int e,i;
	printf("输入插入的数据值:");
	scanf("%d",&e);
	printf("请输入插入位置:");
	scanf("%d",&i);
	InsertLinkById(L2,i,e);//在位置3处插入数据e 
	printf("输出插入后的单链表为:");
	ShowLink(L2);//输出链表数据
	printf("\n");
	
	//删除指定位置的数据
	int j,temp;//将待删除的元素值赋值予temp ;j是待删除的数据元素的位置 
	printf("输入要删除的位置:");
	scanf("%d",&j);
	DeleteLink(L2,j,temp);//调用方法体 
	printf("删除的元素值为:%d\n",temp);
	ShowLink(L2);//输出链表数据
	printf("\n");
	 
	//-----数据个数 
	printf("单链表的长度既是头结点的数值为:%d",L2->data);//链表长度不包括头结点。 
	return 0;
} 

//初始化头结点 
LinkList InitLink(){
	Node *P;
	P = (Node *) malloc (sizeof(Node));//申请内存空间 
	P->next = NULL;//指针域置空。 
	P->data = 0;//将头结点的值设为0,方便记录数据个数。 
	return P;
}
//创建单链表-头插法-与输入成逆序态 
void CreateLink1(LinkList &L){
	LinkList P = L;
	for(int i = 0; i <= 5 ;i++){
		Node *Q = (Node*) malloc (sizeof(Node));//创建结点Q 
		Q->data = i;
		Q->next = P->next;
		P->next = Q;
		//头结点数据域+1 
		CountByHead(P);
	}
}
//创建单链表-尾插法-与输入顺序相同
void CreateLink2(LinkList &L){
	LinkList End = L;
	for(int i = 0; i <= 5; i++){
		Node *P = (Node*) malloc (sizeof(Node));
		P->data = i;
		P->next = NULL;
		End->next = P;
		End = P;
		CountByHead(L);//头结点数据域+1
	}
} 
//插入单条记录-末尾 
void InsertLink(LinkList &L,int a){
	LinkList Q = L; 
	LinkList P = (LinkList) malloc (sizeof(Node));
	P->data = a;
	P->next = NULL;
	while(Q->next){
		Q = Q->next;
	}
	Q->next = P;
	CountByHead(L);//头结点数据域+1
}
//在指定的位置插入数据e 
void InsertLinkById(LinkList &L,int i,int e){
	LinkList Q = L;
	LinkList P = (LinkList) malloc (sizeof(Node));
	P->data = e;
	P->next = NULL;
	if(i <1 || i-1 > L->data){
		printf("插入位置不符合要求");
		exit(0);//退出进程 
	}
	int k = 1;
	//寻找到第i-1个元素 
	while(Q->next && k<i){
		Q = Q->next;
		k++;
	}
	P->next = Q->next;
	Q->next = P; 
	CountByHead(L);
	free(P);//释放表空间 
}
//删除指定位置的数据元素 
void DeleteLink(LinkList &L,int j,int &temp){
	LinkList P = L;
	LinkList Q;
	if(j<1||j>L->data){
		printf("删除位置非法!!");
		exit(0);
	}
	//寻找第j - 1个数据元素
	int k = 1;
	while(P->next && k < j){
		P = P->next;
		k++;
	}
	temp = P->next->data;//把删除的数据赋值给temp 
	Q = P->next;
	P->next = Q->next;
	L->data--;//数据元素个数-- 
	free(Q);
} 
//输出单链表
void ShowLink(LinkList L){
	while(L){
		printf("%d ",L->data);
		L = L->next;
	}
}
//利用头结点记录数据个数
void CountByHead(LinkList &L){
	L->data ++;
} 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值