在#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
typedef char ElemType;
typedef int Status;
//定义单链表结构体
typedef struct LNode {
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//操作结果:构造一个空的线性单链表L
Status ListInit_L(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));//头结点申请地址
if(!L){//if(L==NULL)
printf("分配内存失败!\n");
exit(OVERFLOW);
}
else
L->next=NULL;
return OK;
}
//初始条件:线性单链表已存在,1<=i<=ListLength(L)
//操作结果:用e返回L中第i个数据元素的值
Status ListGet_L(LinkList L,int i,ElemType &e){
//L为带头结点的单链表的头指针
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
LinkList p=L->next;//初始化p指向第一个结点
int j=1;//j为计时器
while(p&&j<i){//顺时针向后查找,直到p指向第i个元素或p为空
p=p->next;
++j;
}
if(!p||j>i){
printf("查询不到该元素!\n");
return ERROR;//第i个元素不存在
}
e=p->data;//取第i个元素
return OK;
}
//初始条件:线性单链表l已存在,1<=i<=ListLength(L)+1
//操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
Status ListInsert_L(LinkList &L,int i,ElemType e){
LinkList p=L;
int j=0;
while(p&&j<i-1){
p=p->next;++j;//寻找第i-1个结点
}
if(!p||j>i-1){
printf("插入元素失败!\n");
return ERROR;//i小于1或者大于表长加1
}
LinkList s=(LinkList)malloc(sizeof(LNode));//生成新结点
s->data=e;s->next=p->next;//插入L中
p->next=s;
return OK;
}
//初始条件: 线性单链表L已存在且非空,1<=i<=ListLength(L)
//操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1
Status ListDelete_L(LinkList &L,int i,ElemType &e){
LinkList p;
LinkList q;
p=L;int j=0;
while(p->next&&j<i-1){//寻找第i个结点,并用p指向其前趋
p=p->next;++j;
}
if(!(p->next)||j>i){
printf("删除元素失败!\n");
return ERROR;//删除位置不合理
}
q=p->next; p->next=q->next;//删除并释放结点
e=q->data; free(q);
return OK;
}
//初始条件:线性单链表L已存在
//操作结果:逆位序输入n个元素的值,建立带表头结点的线性单链表 L(头插法)
void ListCreate_L(LinkList &L,int n){
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;//先建立一个带头结点的单链表
LinkList p;
srand(unsigned(time(0))); //初始化随机数种子
printf("请输入你要插入的元素值(用空格隔开):");
for(int i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));//生成新结点
//scanf("%c",&p->data);//输入元素值
p->data=rand()%100+1; //随机生成100以内的数字,比scanf()操作简单些
//插入到表头
p->next=L->next;
L->next=p; //将结点p连接在头结点L之后
}
}
/*
LinkedList LinkedListCreatT(){ //尾插法
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LinkList p;
for(int i=n;i>0;--i){
p=(LinkList)malloc(sizeof(LNode));
scanf("%c",&p->data);
L->next=p;
L=p;
}
L->next=NULL;
}
*/
//初始条件:线性单链表L已存在
//操作结果:将L重置为空表
Status ListClear_L(LinkList &L){
LinkList p=L->next;//p指向第一个结点
LinkList q;
while(p)//没到表尾
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;//头结点指针域为空
return OK;
}
//初始条件:线性单链表L已存在
//操作结果:销毁线性单链表L
Status ListDestroy_L(LinkList &L){
LinkList p;
while(L)
{
p=L;
L=L->next;
free(p);
}
return OK;
}
//线性单链表L已存在
//操作结果:返回L中数据元素个数
int ListLength_L(LinkList L)
{
int len=0;
while(L->next!=NULL)
{
len++;
L=L->next;
}
return len;
}
//初始条件:线性单链表L已存在
//操作结果:若L为空表,则返回TRUE,否则返回FALSE
Status ListEmpty_L(LinkList &L)
{
if(L->next==NULL)
return TRUE;
else
return FALSE;
}
//初始条件:线性单链表L已存在
//操作结果: 当i是L的数据元素且不是第一个元素时,用e返回第i个元素的前继
Status ListPrior_L(LinkList &L,int i){
LinkList p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)return ERROR;
int e=p->data;
return e;
}
//初始条件:线性单链表L已存在
//操作结果: 当i是L的数据元素且不是最后一个元素时,用e返回第i个元素的后继
Status ListNext_L(LinkList &L,int i){
LinkList p=L;
int j=0;
while(p&&j<i+1)
{
p=p->next;
++j;
}
if(!p||j>i+1)return ERROR;
int e=p->data;
return e;
}
//初始条件:线性单链表L已存在
//操作结果:返回L中第1个与e相等的元素的位置
Status ListLocate_L(LinkList L,int e){
LinkList p=L->next;
int num=1;
int k=0;
while(p)
{
p=p->next;
num++;
if(p->data==e)
{
k=num;
break;
}
}
if(k)
return k;
else
return ERROR;
}
//操作结果:显示单链表各个元素
Status ListDis_L(LinkList &L){
LinkList p=L->next;
if(!p){
printf("这是一个空目录!\n");
return ERROR;
}
printf("单链表:\n");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return OK;
}
int main()
{
LinkList h;
ListInit_L(h);
ElemType e;
int k,i;
ListCreate_L(h,10);
ListDis_L(h);
printf("单链单链表的长度为%d\n",ListLength_L(h));
ListGet_L(h,3,e);
printf("第3个元素的值为:%d\n",e);
ListInsert_L(h,5,25);
printf("在第5个元素之前插入元素后的");
ListDis_L(h);
ListDelete_L(h,7,e);
printf("删除第7个元素后的");
ListDis_L(h);
printf("删除的元素为:%d\n",e);
printf("第6个元素的前继为:%d\n",ListPrior_L(h,6));
printf("第6个元素的后继为:%d\n",ListNext_L(h,6));
printf("第%d个元素与指定值相同\n",ListLocate_L(h,25));
printf("线性单链表是否为空?1为空0不为空 %d\n",ListEmpty_L(h));
ListClear_L(h);
printf("线性单链表是否为空?1为空0不为空 %d\n",ListEmpty_L(h));
printf("销毁后线性单链表L的元素为:",ListDestroy_L(h));
system("pause");
return 0;
}
数据结构(C语言版)---------单链表
最新推荐文章于 2023-01-02 15:53:23 发布