数据结构——链表(类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);
}