【数据结构——单向链表(类C代码实现)】

数据结构——链表(类C代码实现)

本人为在读本科大学生,能力有限。
如有错误,请联系我更正(QQ:2169788850)或在评论区留言。
代码配合严蔚敏——数据结构(c语言版)和王卓老师网课编写,完全免费,仅供学习交流使用。
由于使用教材严蔚敏——数据结构(c语言版)中的代码为类C伪代码,并不直观,本系列旨在将所有代码在电脑上实现。

使用说明

宏定义部分保存为 “hong_define.h”
其余各部分可放在“linklist.cpp” 切记切记切记后缀是 .cpp

宏定义

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

#define TRUE 1
#define FALSE 0
#define  OK 1
#define  ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
typedef int ElemType;

链表的定义

#include"hong_define.h"
//单链表
 
/*
具体使用时可定义一种结构体类型ElemType来作数据域 (便于管理)如: 
typedef struct{
	float num[8];
	char name[8];
	int score;
} ElemType;
*/

typedef struct Lnode{
	ElemType data;   
	struct Lnode *next;
}Lnode,*linklist;
//linklist为指向struct lnode的指针类型 
//定义好后便可用linklist l来定义链表l;
//Lnode*p来定义结点指针p

链表的初始化

Status inilist(linklist &l) {
	l=(linklist)malloc(sizeof(Lnode));
	l->next=NULL;//头节点置空 
	return OK;	
}

链表是否为空

void isemptylist(linklist &l){
	if(l->next==NULL){
		printf("表为空"); 
	}
	else{
		printf("表不为空");
	}
};

链表的销毁

Status destroylist(linklist &l){
	Lnode *p;//存放要销毁节点的地址 
	while(l) {
		p=l;//从头结点开始 
		l=l->next;
		free(p);
	}
	return OK; 
}

链表的清空

Status clearlist(linklist &l){
	Lnode *p,*q;
	p=l->next;//从首元结点开始
	while(p){	 
		q=p->next;
		free(p);
		p=q;		
	}
	l->next=NULL;
	return OK;
}

链表的长度

void listlength(linklist l){
	Lnode *p;
	int i=0;
	p=l->next;
	while(p){
		i++;
		p=p->next;
	}
	printf("表的长度为%d\n",i);
};

链表-按位查找

Status getdata(linklist l,int i,ElemType &e){
	Lnode *p;
	p=l->next;
	int j=1;
	while(p&&j<i){
		p=p->next;
		j++;
	}
	if(!p||j>i) {
		return ERROR;
	}
	e=p->data;
	printf("链表第%d位置上元素为%d\n",i,e);
	return OK;
}

链表-按值查找

void locatedata(linklist l,ElemType e) {
	Lnode*p; 
	p=l->next;
	int j=1;
	while(p&&p->data!=e){
		p=p->next;
		j++;
	}
	if(p){
		printf("该值为链表的第%d个元素\n",j);

	}
	else{	
		printf("链表中无%d\n",e);
	}	
}

链表元素的插入

Status insdata(linklist &l,int i,ElemType e){
	Lnode*p;
	p=l;//因为可能插入到第一个位置,所以要从头结点开始 
	int j=0;
	while(p&&j<i-1){
		p=p->next;
		j++;
	} 
	if(!p||j>i-1){
		return ERROR;
	}
	Lnode*s;
	s=(Lnode*)malloc(sizeof(Lnode));
	s->data=e;
	s->next=p->next;
	p->next=s; 
	return OK;
}

链表元素的删除

Status dellistdata(linklist &l,int i,ElemType &e){
	Lnode*p;
	p=l;
	int j=0;
	while(p->next&&j<i-1){
		p=p->next;
		j++;
	} 
	if(!(p->next)||j>i-1){
		return ERROR;
	}
	Lnode*q;
	q=p->next;
	p->next=q->next;
	e=q->data;
	printf("被删除的元素是%d\n",e);
	free(q);
	return OK;
};

链表元素的遍历

void viewlist(linklist &l){
	Lnode*p;
	if(l->next){	
	p=l->next;
	printf("链表中的元素有:");
	while(p){
		printf("%d\t",p->data);
		p=p->next;
	}
	printf("\n");		
	}
	else{
		printf("表为空"); 
	}
	
}

链表的头插建立法 o(n)

void creatlist_reversesq(linklist &l,int n) {
	l=(linklist)malloc(sizeof(Lnode));
	l->next=NULL;	
	for(int i=0;i<n;i++){
		Lnode*p;
		p=(Lnode*)malloc(sizeof(Lnode));
		printf("请输入链表的第%d个元素:",n-i);
		scanf("%d",&p->data);
		p->next=l->next;
		l->next=p;
	}
}

链表的尾插建立法 o(n)

void creatlist_sq(linklist &l,int n) {
	l=(linklist)malloc(sizeof(Lnode));
	l->next=NULL;
	Lnode*p,*end;	
	end=(Lnode*)malloc(sizeof(Lnode));
	end=l;	
	for(int i=0;i<n;i++){
		p=(Lnode*)malloc(sizeof(Lnode));				
		printf("请输入链表的第%d个元素:",i+1);
		scanf("%d",&p->data);
		p->next=NULL;
		end->next=p;
		end=p;
	}
}
样例说明
int main(){	
	linklist l_1,l_2,l;
	ElemType e1=1,e2=2,e3=3,e;
		
	inilist(l);
	insdata(l,1,e1);
	insdata(l,2,e2);
	insdata(l,3,e3);
	viewlist(l);
	dellistdata(l,2,e);
	viewlist(l);
	
	creatlist_sq(l_1,4);
	viewlist(l_1);
	listlength(l_1);
	isemptylist(l_1);
	clearlist(l_1);
	isemptylist(l_1);
	
	creatlist_reversesq(l_2,5);
	viewlist(l_2);
	listlength(l_2);	
	isemptylist(l_2);
	destroylist(l_2);

}
最终运行结果展示

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值