顺序单链表(c语言代码实现)
#include<iostream>
#include<bits/stdc++.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
/*
#include<iostream>
#include<stdio.h>
#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
*/
using namespace std;
//定义顺序单链表
Elemtype data; // 当前单链表节点的数据
struct Node *next;// 指向下一个单链表节点
}Node;
typedef struct Node *Linklist; //单链表的头指针
//初始顺序化单链表
Status Linklistinit(Linklist *l)
{
(*l)=(Linklist)malloc(sizeof(Node)); //动态分配一个头指针的链表出来
if(!(*l))
{
cout<<"动态分配单链表的头指针失败"<<endl;
return ERROR;
}
(*l)->next=NULL; //初始化的头结点指向NULL
return OK;
}
//访问单个顺序单链表结点的数据
void visit(Elemtype c)
{
cout<<c<<" ";
}
//判断顺序单链表是否为空
Status Linklistempty(Linklist l)
{
if(l->next)
{
return FALSE;
}
return TRUE;
}
//求顺序单链表的长度
int Linklistlength(Linklist l)
{
Linklist p;
p=l->next;
int j=0;
while(p){
j++;
p=p->next;
}
return j;
}
//清空顺序单链表
Status clearLinklist(Linklist *l)
{
Linklist p,q;
p=(*l)->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
(*l)->next=NULL;
return OK;
}
//按位查找顺序单链表
Status getElem(Linklist l,int i,Elemtype *e)
{
Linklist p;
p=l->next;
int j=1;
while(p&&j<i)
{
j++;
p=p->next;
}
if(!p||j>i)
return ERROR;
*e=p->data;
return OK;
}
//按值查找顺序单链表
int locatelem(Linklist l,Elemtype e)
{
Linklist p,q;
p=l->next;
int j=0;
while(p)
{
j++;
if(p->data==e)
return j;
p=p->next;
}
return 0;
}
//插入结点到顺序单链表中
Status insertelem(Linklist *l,int i,Elemtype e)
{
Linklist p,s;
p=(*l);
int j=1;
while(p&&j<i)
{
j++;
p=p->next;
}
if(!p||j>i)
{
return ERROR;
}
s=(Linklist)malloc(sizeof(Node));
s->next=p->next;
s->data=e;
p->next=s;
return OK;
}
//删除顺序单链表的结点
Status deletelem(Linklist *l,int i,Elemtype *e)
{
Linklist p,q;
p=(*l);
int j=1;
while(p->next&&j<i){
j++;
p=p->next;
}
if(!(p->next)||j>i)
return ERROR;
q=p->next;
*e=q->data;
p->next=q->next;
free(q);
return OK;
}
//遍历顺序单链表的所有结点的数据域
Status traverseLinklist(Linklist l)
{
Linklist p;
p=l->next;
while(p)
{
visit(p->data);
p=p->next;
}
cout<<endl;
return OK;
}
头插法创建单链表
void creatlinkhead(Linklist *l,int n){
Linklist p;
(*l)=(Linklist)malloc(sizeof(Node));
(*l)->next=NULL;
srand(time(0));
for(int i=0;i<n;i++)
{
p=(Linklist)malloc(sizeof(Node));
p->data=rand()%100+1;
p->next=(*l)->next;
(*l)->next=p;
cout<<"这是第"<<i+1<<"次插入的数值为"<<p->data<<endl;
}
}
尾插法创建单链表
void creatlisttail(Linklist *l,int n){
Linklist p,r;
(*l)=(Linklist)malloc(sizeof(Node));
r=*l;
srand(time(0));
for(int i=0;i<n;i++){
p=(Linklist)malloc(sizeof(Node));
p->data=rand()%100+1;
r->next=p;
r=p;
cout<<"这是第"<<i+1<<"次插入的数值为"<<p->data<<endl;
}
r->next=NULL;
}
主体函数
int main()
{
Linklist l;
Elemtype e;
/*
if(Linklistinit(&l))
cout<<"单链表初始化完成"<<endl;
else
cout<<"单链表初始化失败"<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"获取单链表长度函数"<<endl;
cout<<"单链表长度为:"<<Linklistlength(l)<<endl;
cout<<"检查判空函数是否生效"<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
if(!Linklistempty(l))
cout<<"判空函数生效且单链表不为空"<<endl;
else
cout<<"判空函数生效且单链表为空"<<endl;
//检查插入函数
cout<<"检查插入函数是否生效"<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"请输入你要插入的节点总数"<<endl;
int sum;
cin>>sum;
for(int i=1;i<=sum;i++)
{
cout<<"请输入你要插入第"<<i<<"个节点的数据域为多少:"<<endl;
int num;
cin>>num;
insertelem(&l,i,num);
}
cout<<"遍历单链表中的所有节点数据域如下所示:"<<endl;
traverseLinklist(l);
cout<<"当前单链表长度为:"<<Linklistlength(l)<<endl;
//检查按位查找函数
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"检查按位查找函数是否生效"<<endl;
cout<<"请输入你一共要查找多少节点的数据域"<<endl;
int sum2;
cin>>sum2;
for(int i=1;i<=sum2;i++)
{
cout<<"请输入你第"<<i<<"次查找的下标是多少"<<endl;
int pos2;
cin>>pos2;
if(getElem(l,pos2,&e))
{
cout<<"单链表中查找到了下标为"<<pos2<<"的值为:"<<e<<endl;
}
else
cout<<"单链表中没有找到你所要下标的值 该下标越界啦"<<endl;
}
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"检查按值查找函数是否生效"<<endl;
cout<<"请输入你一共要按值查找多少节点的数据域"<<endl;
int v_num;
cin>>v_num;
for(int i=1;i<=v_num;i++)
{
cout<<"请输入你第"<<i<<"次按值查找的值为多少"<<endl;
int value;
cin>>value;
if(locatelem(l,value))
{
cout<<"单链表中找到了值为"<<value<<"的值下标为:"<<locatelem(l,value)<<endl;
}
else
cout<<"单链表中没有找到你所要的值的下标 不存在该值"<<endl;
}
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
//检查删除函数
cout<<"检查删除函数是否生效"<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"请输入一共你要删除多个个节点的值"<<endl;
int sum1;
cin>>sum1;
for(int i=1;i<=sum1;i++)
{
cout<<"请输入你要删除单链表中下标为多少的数据域"<<endl;
int pos;
cin>>pos;
deletelem(&l,pos,&e);
if(pos>Linklistlength(l))
cout<<"你要删除的值越界了 删了不存在的值"<<endl;
cout<<"遍历单链表中的所有节点数据域如下所示:"<<endl;
traverseLinklist(l);
cout<<"当前单链表长度为:"<<Linklistlength(l)<<endl;
}
cout<<"检查清空函数是否生效"<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
cout<<"............."<<endl;
if(clearLinklist(&l))
{
cout<<"清空函数生效"<<endl;
cout<<"当前单链表是否为空?"<<endl;
if(!Linklistempty(l))
cout<<"当前单链表不为空"<<endl;
else
cout<<"当前单链表为空"<<endl;
}
else
cout<<"清空函数失效"<<endl;
*/
//检验头插法函数
cout<<"利用头插法进行创立单链表"<<endl;
cout<<"请输入你要创建多少个数插入单链表"<<endl;
int num_h;
cin>>num_h;
creatlinkhead(&l,num_h);
traverseLinklist(l);
//检验尾插法函数
cout<<"利用尾插法进行创立单链表"<<endl;
cout<<"请输入你要创建多少个数插入单链表"<<endl;
int num_t;
cin>>num_t;
creatlisttail(&l,num_t);
traverseLinklist(l);
return 0;
}