数据结构—单链表操作及实现(C/C++)
文章目录
1.0初始化定义
#include<iostream>
#define MAXSIZE 100
#define ERROR -1
#define OK 1
using namespace std;
typedef int status;//自己定义的类型
typedef int ElemType; //上同
1.1单链表的定义
typedef struct LNode
{
ElemType data; //存储节点的数据域
struct LNode* next; //存储后继节点位置的指针域next
}LNode, * LinkList;
-
**说明:LinkList和LNode的区别,其实两者本质是等价的,只是习惯上用LinkList定义单链表,强调定义是单链表的头指针,而==LNode定义指向单链表中的任意节点的指针变量==。
-
*LinkList p :*p为指向节点的指针变量,表示该节点的地址。
-
LNode p: p为指向单链表某个节点的指针,*p就是该节点 , *p为对应节点的变量,表示该节点的名称。
-
头结点:**在首元节点之前设置的一个节点,头结点的next域(指针域)指向首元节点。
-
头指针:**指向链表中第一个节点的指针,如果链表有头结点,则头指针指向链表的头结点,如果没有头结点,则指向首元节点,例如当链表没有头结点时,头指针就应该指向首元节点,判断空表的条件可为:L==NULL,反之,当有头结点时候,无论链表是否为空,头指针都是指向头结点的飞空指针。判断空表条件就是:L->next==NULL
1.2单链表的初始化
status Initlist(LNode* L)
{
L = new LNode; //生成新节点作为头节点,用头指针L指向头结点
L->next = NULL; //头结点置空
return OK;
}
1.3单链表的取值
status GetElem(LNode* L, int i, ElemType& e)
{
int j = 1; //初始化,p指向头结点,计数器j 初始为1
LNode* p;
p = L->next; //指向头结点
while (p && j < i) //p不为0并且计数器值小于i的值
{
p = p->next; //p指向p的后继节点
j++; //计数器+1
}
if (!p || j > i)
{
return ERROR;
}
else
{
e = p->data;
}
return OK;
}
1.4单链表按值查找
status LocateElem(LNode* L,ElemType e)
{
int j=1;
LNode* p;
p = L->next;
while(p&&p->data!=e)
{
p = p->next;
j++;
}
cout<<j<<endl;
return OK;
}
1.5单链表的插入
status ListInsert(LNode* L,int i,ElemType e)
{
int j = 0;
LNode* p;
LNode* s;
p = L;
while(p&&(j<i-1))
{
p = p->next;
j++;
}
if(!p||j>i-1)
{
return ERROR;
}
else
{
s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
}
return OK;
}
1.6单链表的删除
tatus ListDelete(LNode* L,int i)
{
int j = 0;
LNode* p;
LNode* q;
p = L;
while((p->next)&&(j<i-1))
{
p = p->next;
j++;
}
if(!(p->next)||(j>i-1))
{
return ERROR;
}
else
{
q=p->next;
p->next=q->next;
delete q;
}
return OK;
}
1.7头插法(前插法)建立单链表
status tailInsert(LinkList &L)
{
LinkList s;
ElemType x;
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
cout << "请依次输入元素x的值,最后输入9999结束输入!"<<endl;
cin>>x;
while(x!=9999)
{
s =(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next = L->next;
L->next = s;
cin>>x;
}
return OK;
}
1.8尾插法(后插法)建立单链表
status tailInsert2(LinkList &L)
{
ElemType x;
LNode* r;
LNode* s;
L = new LNode;
L->next = NULL;
r = L;
cout << "请依次输入元素x的值,最后输入9999结束输入!"<<endl;
cin >> x;
while(x!=9999)
{
s = new LNode;
s->next = NULL;
s->data = x;
r->next = s;
r = s;
cin >> x;
}
r->next = NULL;
return OK;
}
1.9输出单链表函数
void print(LinkList L)
{
LinkList p=L->next ;
printf("当前的链表元素为:");
while(p!=NULL)
{
printf(" %d",p->data);
p=p->next;
}
cout<<endl;
}
2.0 C 完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define ERROR -1
#define OK 1
typedef int status;
typedef int ElemType;
//定义单链表
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode, * LinkList;
//初始化单链表
status Initionlist(LNode* L)
{
L = (LNode*)malloc(sizeof(LNode)); //生成新节点作为头节点,用头指针L指向头结点
L->next = NULL; //头结点置空
return OK;
}
//单链表的取值
status GetElem(LNode* L, int i, ElemType& e)
{
int j = 1; //初始化,p指向头结点,计数器j 初始为1
LNode* p;
p = L->next; //指向头结点
while (p && j < i) //p不为0并且计数器值小于i的值
{
p = p->next; //p指向p的后继节点
j++; //计数器+1
}
if (!p || j > i)
{
return ERROR;
}
else
{
e = p->data;
}
return OK;
}
//单链表按值查找w位置
status LocateElem(LNode* L,ElemType e)
{
int j=1;
LNode* p;
p = L->next;
while(p&&p->data!=e)
{
p = p->next;
j++;
}
printf("%d",j);
return OK;
}
//单链表的插入操作
status ListInsert(LNode* L,int i,ElemType e)
{
int j = 0;
LNode* p;
LNode* s;
p = L;
while(p&&(j<i-1))
{
p = p->next;
j++;
}
if(!p||j>i-1)
{
return ERROR;
}
else
{
s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
}
return OK;
}
//单链表的删除操作
status ListDelete(LNode* L,int i)
{
int j = 0;
LNode* p;
LNode* q;
p = L;
while((p->next)&&(j<i-1))
{
p = p->next;
j++;
}
if(!(p->next)||(j>i-1))
{
return ERROR;
}
else
{
q=p->next;
p->next=q->next;
delete q;
}
return OK;
}
//头插法(前插法)建立单链表
status tailInsert(LinkList &L)
{
LinkList s;
ElemType x;
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
printf("请依次输入元素x的值,最后以9999结束输入:\n");
scanf("%d",&x);
while(x!=9999)
{
s =(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return OK;
}
//尾插法(后插法)建立单链表
status tailInsert2(LinkList &L)
{
ElemType x;
LNode* r;
LNode* s;
L = (LNode*)malloc(sizeof(LNode));;
L->next = NULL;
r = L;
printf("请依次输入元素x的值,最后以9999结束输入:\n");
scanf("%d",&x);
while(x!=9999)
{
s = (LNode*)malloc(sizeof(LNode));;
s->next = NULL;
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
return OK;
}
void print(LinkList L)
{
LinkList p=L->next ;
printf("当前的链表元素为:");
while(p!=NULL)
{
printf(" %d",p->data);
p=p->next;
}
}
int main()
{
LinkList L;
Initionlist(L);
printf("头插法建立单链表:\n");
tailInsert(L);
print(L);
printf("\n");
printf("删除第三个位置的值,");
ListDelete(L,3);
print(L);
printf("\n");
printf("插入第三个位置的值,");
ListInsert(L,3,88);
print(L);
printf("\n");
printf("元素88的位置是:");
LocateElem(L,88);
printf("\n");
printf("\n");
printf("\n");
printf("尾插法建立单链表:\n");
tailInsert2(L);
print(L);
printf("\n");
printf("删除第三个位置的值,");
ListDelete(L,3);
print(L);
printf("\n");
printf("插入第三个位置的值,");
ListInsert(L,3,88);
print(L);
printf("\n");
printf("元素88的位置是:");
LocateElem(L,88);
return 0;
}
2.1 C++完整代码如下:
#include<iostream>
#define MAXSIZE 100
#define ERROR -1
#define OK 1
using namespace std;
typedef int status;
typedef int ElemType;
//定义单链表
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode, * LinkList;
//初始化单链表
status Initionlist(LNode* L)
{
L = new LNode; //生成新节点作为头节点,用头指针L指向头结点
L->next = NULL; //头结点置空
return OK;
}
//单链表的取值
status GetElem(LNode* L, int i, ElemType& e)
{
int j = 1; //初始化,p指向头结点,计数器j 初始为1
LNode* p;
p = L->next; //指向头结点
while (p && j < i) //p不为0并且计数器值小于i的值
{
p = p->next; //p指向p的后继节点
j++; //计数器+1
}
if (!p || j > i)
{
return ERROR;
}
else
{
e = p->data;
}
return OK;
}
//单链表按值查找w位置
status LocateElem(LNode* L,ElemType e)
{
int j=1;
LNode* p;
p = L->next;
while(p&&p->data!=e)
{
p = p->next;
j++;
}
cout<<j<<endl;
return OK;
}
//单链表的插入操作
status ListInsert(LNode* L,int i,ElemType e)
{
int j = 0;
LNode* p;
LNode* s;
p = L;
while(p&&(j<i-1))
{
p = p->next;
j++;
}
if(!p||j>i-1)
{
return ERROR;
}
else
{
s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
}
return OK;
}
//单链表的删除操作
status ListDelete(LNode* L,int i)
{
int j = 0;
LNode* p;
LNode* q;
p = L;
while((p->next)&&(j<i-1))
{
p = p->next;
j++;
}
if(!(p->next)||(j>i-1))
{
return ERROR;
}
else
{
q=p->next;
p->next=q->next;
delete q;
}
return OK;
}
//头插法(前插法)建立单链表
status tailInsert(LinkList &L)
{
LinkList s;
ElemType x;
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
cout << "请依次输入元素x的值,最后以9999结束输入:"<<endl;
cin>>x;
while(x!=9999)
{
s =(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next = L->next;
L->next = s;
cin>>x;
}
return OK;
}
//尾插法(后插法)建立单链表
status tailInsert2(LinkList &L)
{
ElemType x;
LNode* r;
LNode* s;
L = new LNode;
L->next = NULL;
r = L;
cout << "请依次输入元素x的值,最后以9999结束输入:"<<endl;
cin >> x;
while(x!=9999)
{
s = new LNode;
s->next = NULL;
s->data = x;
r->next = s;
r = s;
cin >> x;
}
r->next = NULL;
return OK;
}
void print(LinkList L)
{
LinkList p=L->next ;
printf("当前的链表元素为:");
while(p!=NULL)
{
printf(" %d",p->data);
p=p->next;
}
}
int main()
{
LinkList L;
Initionlist(L);
cout<<"头插法建立单链表:"<<endl;
tailInsert(L);
print(L);
cout<<endl;
cout<<"删除第三个位置的值,";
ListDelete(L,3);
print(L);
cout<<endl;
cout<<"插入第三个位置的值,";
ListInsert(L,3,88);
print(L);
cout<<endl;
cout<<"元素88的位置是:";
LocateElem(L,88);
cout<<endl<<endl<<endl;
cout<<"尾插法建立单链表:"<<endl;
tailInsert2(L);
print(L);
cout<<endl;
cout<<"删除第三个位置的值,";
ListDelete(L,3);
print(L);
cout<<endl;
cout<<"插入第三个位置的值,";
ListInsert(L,3,88);
print(L);
cout<<endl;
cout<<"元素88的位置是:";
LocateElem(L,88);
return 0;
}
2.1 运行截图
2.2参考书籍
《数据结构》(C语言版)(第2版)—严蔚敏 李冬梅 吴伟民 编著
2.3总结
对于链表,在确定插入和删除位置后,插入或删除操作无需移动数据,只需要修改指针。
有时间我在好好完善一下内容,这个没有修改多少。
水平有限,如果有错误的地方希望大家能够多指正!
写博客不容易,动动大家小手,多多关注!!!