#include<stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status; //Status是函数的类型,其值是函数结果状态OK等
typedef int ElemType; // ElemType类型根据实际情况而定这里设为int型
typedef struct LNode //定义单链表结点类型
{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
/************初始化******************************/
Status InitList() {
LNode *L;
L = (LinkList)malloc(sizeof(LNode)); //创建头结点
if(L == NULL) { //判断是否有足够的内存空间
printf("申请内存空间失败\n");
}
L->next = NULL; //将next设置为NULL,初始为空单链表
// return L;
}
/*******尾插法随机产生n个元素的建立带表头结点的单链表L*********/
Status CreateList(LinkList *L,int n)
{
LinkList s, r;
int i;
printf("输入建立链表元素长度n:");
scanf("%d",&n);
srand(time(0)); //产生随机数
*L = (LinkList)malloc(sizeof(LNode)); //创建头结点
r=*L; // r为表尾指针
(*L)->next=NULL; //初始化为空链表
for (i=0;i<n;i++)
{
s = (LNode *)malloc(sizeof(LNode)); //生成新结点
s->data = rand()%1000+1; //随机生成1000以内的数字
r->next=s; //表尾终指针指向新结点
r=s; //r指向新结表尾结点
}
r->next = NULL; //表尾指针置空
}
/*******头插法随机产生n个元素的建立带表头结点的单链表L*********/
Status CreateListHead(LinkList *L, int n)
{
LinkList p;
int i;
printf("输入建立链表元素长度n:");
scanf("%d",&n);
srand(time(0));
*L = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL; //初始化为空链表
for (i=0;i<n;i++)
{
p = (LNode *)malloc(sizeof(LNode)); //生成新结点
p->data = rand()%1000+1; //随机生成1000以内的数字
p->next = (*L)->next;
(*L)->next = p; // 插入到表头
}
}
/*******************第i个位置前插入(头插法)************************************/
Status CreateList1(LinkList *L,int i,ElemType e)
{
int j=0;
LinkList s, p;
p=*L;
while(p&&j<i-1) //寻找第i-1个结点
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); //创建头结点
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
/**********返回L中第i个元素的值(按序号查找结点值)******************/
Status GetElem(LinkList L,int i) //第i个元素存在时赋值给e并返回OK 否则返回ERROR
{
ElemType e;
LNode *p;
p=L->next; //初始化,p指向第一个结点
int j=1; //j为计数器
if(!p||j>i) //查找的第i个元素不存在
return ERROR;
while(p&&j<i) //p为空或者p指向第i个元素
{
p=p->next;
++j;
}
e=p->data; //e区第i个元素的值
printf("%d",e);
//return 0;
}
/************按值查找表结点*********************/
Status *GetElem1(LinkList L,ElemType e) //查找L中data值等于e的结点指针,否则返回NULL
{
LNode *p=L->next; //p指向头结点
while(p!=NULL&&p->data!=e)
{
p=p->next;
}
printf("%d",p);
return p;
}
/******************删除*********************/
Status ListDelete(LinkList *L,int i,ElemType *e) //删除第i个元素 ,由e返回
{
int j=0;
LinkList p,q;
p=*L;
while(p->next&&j<i-1) // 遍历寻找第i个结点,并令p指向其前驱
{
p = p->next;
++j;
}
if (!(p->next)||j>i) //删除位置不合理
return ERROR;
q = p->next;
p->next = q->next; //将q的后继赋值给p的后继
*e = q->data; // 将q结点中的数据给e
free(q); // 让系统回收此结点,释放内存
return OK;
}
/**************获取表长***************/
Status ListLength(LinkList L)
{
int i=0;
LinkList p=L->next; // p指向第一个结点
while(p)
{
i++;
p=p->next;
}
return i;
printf("表长为:%d",i);
}
/******************打印查看****************/
Status display(LinkList L)
{
LinkList i;
i=L->next; //p指向第一个结点
while(i)
{
printf("%d ",i->data);
i=i->next;
}
printf("\n");
return OK;
}
int main()
{
int i,n;
int k;
ElemType e;
LinkList p,L;
InitList(L); //初始化单链表L
printf("1打印查看链表 2创建链表(尾插法)3创建链表(头插法)\n4按序号查找链表 5按值查找表结点 6头插法 7删除 8链表长度 0.退出 \n");
printf("\n");
while(n!= 0)
{
printf("请选择你的操作:");
scanf("%d",&n);
switch(n)
{
case 1:
display(L);
printf("\n");
break;
case 2:
printf("创建链表L(尾插法):\n");
CreateList(&L,n);
display(L);
printf("\n");
break;
case 3:
printf("创建链表L(头插法):\n");
CreateList(&L,n);
display(L);
printf("\n");
break;
case 4:
CreateList(&L,n);
display(L);
printf("输入要查找的序号i:");
scanf("%d",&i);
GetElem(L,i);
printf("\n");
break;
case 5:
CreateList(&L,n);
display(L);
printf("输入要查找的元素e:");
scanf("%d",&e);
GetElem1(L,e);
printf("\n");
break;
case 6:
CreateList(&L,n);
display(L);
printf("请输入要插入元素位置i:");
scanf("%d",&i);
printf("请输入要插入元素e:");
scanf("%d",&e);
CreateList1(&L,i,e);
display(L);
printf("\n");
case 7:
CreateList(&L,n);
display(L);
printf("请输入要删除元素位置i:");
scanf("%d",&i);
ListDelete(&L,i,&e);
display(L);
ListLength(L);
printf("\n");
case 8:
ListLength(L);
printf("\n");
case 0:
exit(0);
}
}
return 0;
}
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status; //Status是函数的类型,其值是函数结果状态OK等
typedef int ElemType; // ElemType类型根据实际情况而定这里设为int型
typedef struct LNode //定义单链表结点类型
{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
/************初始化******************************/
Status InitList() {
LNode *L;
L = (LinkList)malloc(sizeof(LNode)); //创建头结点
if(L == NULL) { //判断是否有足够的内存空间
printf("申请内存空间失败\n");
}
L->next = NULL; //将next设置为NULL,初始为空单链表
// return L;
}
/*******尾插法随机产生n个元素的建立带表头结点的单链表L*********/
Status CreateList(LinkList *L,int n)
{
LinkList s, r;
int i;
printf("输入建立链表元素长度n:");
scanf("%d",&n);
srand(time(0)); //产生随机数
*L = (LinkList)malloc(sizeof(LNode)); //创建头结点
r=*L; // r为表尾指针
(*L)->next=NULL; //初始化为空链表
for (i=0;i<n;i++)
{
s = (LNode *)malloc(sizeof(LNode)); //生成新结点
s->data = rand()%1000+1; //随机生成1000以内的数字
r->next=s; //表尾终指针指向新结点
r=s; //r指向新结表尾结点
}
r->next = NULL; //表尾指针置空
}
/*******头插法随机产生n个元素的建立带表头结点的单链表L*********/
Status CreateListHead(LinkList *L, int n)
{
LinkList p;
int i;
printf("输入建立链表元素长度n:");
scanf("%d",&n);
srand(time(0));
*L = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL; //初始化为空链表
for (i=0;i<n;i++)
{
p = (LNode *)malloc(sizeof(LNode)); //生成新结点
p->data = rand()%1000+1; //随机生成1000以内的数字
p->next = (*L)->next;
(*L)->next = p; // 插入到表头
}
}
/*******************第i个位置前插入(头插法)************************************/
Status CreateList1(LinkList *L,int i,ElemType e)
{
int j=0;
LinkList s, p;
p=*L;
while(p&&j<i-1) //寻找第i-1个结点
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); //创建头结点
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
/**********返回L中第i个元素的值(按序号查找结点值)******************/
Status GetElem(LinkList L,int i) //第i个元素存在时赋值给e并返回OK 否则返回ERROR
{
ElemType e;
LNode *p;
p=L->next; //初始化,p指向第一个结点
int j=1; //j为计数器
if(!p||j>i) //查找的第i个元素不存在
return ERROR;
while(p&&j<i) //p为空或者p指向第i个元素
{
p=p->next;
++j;
}
e=p->data; //e区第i个元素的值
printf("%d",e);
//return 0;
}
/************按值查找表结点*********************/
Status *GetElem1(LinkList L,ElemType e) //查找L中data值等于e的结点指针,否则返回NULL
{
LNode *p=L->next; //p指向头结点
while(p!=NULL&&p->data!=e)
{
p=p->next;
}
printf("%d",p);
return p;
}
/******************删除*********************/
Status ListDelete(LinkList *L,int i,ElemType *e) //删除第i个元素 ,由e返回
{
int j=0;
LinkList p,q;
p=*L;
while(p->next&&j<i-1) // 遍历寻找第i个结点,并令p指向其前驱
{
p = p->next;
++j;
}
if (!(p->next)||j>i) //删除位置不合理
return ERROR;
q = p->next;
p->next = q->next; //将q的后继赋值给p的后继
*e = q->data; // 将q结点中的数据给e
free(q); // 让系统回收此结点,释放内存
return OK;
}
/**************获取表长***************/
Status ListLength(LinkList L)
{
int i=0;
LinkList p=L->next; // p指向第一个结点
while(p)
{
i++;
p=p->next;
}
return i;
printf("表长为:%d",i);
}
/******************打印查看****************/
Status display(LinkList L)
{
LinkList i;
i=L->next; //p指向第一个结点
while(i)
{
printf("%d ",i->data);
i=i->next;
}
printf("\n");
return OK;
}
int main()
{
int i,n;
int k;
ElemType e;
LinkList p,L;
InitList(L); //初始化单链表L
printf("1打印查看链表 2创建链表(尾插法)3创建链表(头插法)\n4按序号查找链表 5按值查找表结点 6头插法 7删除 8链表长度 0.退出 \n");
printf("\n");
while(n!= 0)
{
printf("请选择你的操作:");
scanf("%d",&n);
switch(n)
{
case 1:
display(L);
printf("\n");
break;
case 2:
printf("创建链表L(尾插法):\n");
CreateList(&L,n);
display(L);
printf("\n");
break;
case 3:
printf("创建链表L(头插法):\n");
CreateList(&L,n);
display(L);
printf("\n");
break;
case 4:
CreateList(&L,n);
display(L);
printf("输入要查找的序号i:");
scanf("%d",&i);
GetElem(L,i);
printf("\n");
break;
case 5:
CreateList(&L,n);
display(L);
printf("输入要查找的元素e:");
scanf("%d",&e);
GetElem1(L,e);
printf("\n");
break;
case 6:
CreateList(&L,n);
display(L);
printf("请输入要插入元素位置i:");
scanf("%d",&i);
printf("请输入要插入元素e:");
scanf("%d",&e);
CreateList1(&L,i,e);
display(L);
printf("\n");
case 7:
CreateList(&L,n);
display(L);
printf("请输入要删除元素位置i:");
scanf("%d",&i);
ListDelete(&L,i,&e);
display(L);
ListLength(L);
printf("\n");
case 8:
ListLength(L);
printf("\n");
case 0:
exit(0);
}
}
return 0;
}