- 1.创建菜单
- 2.创建单链表
- 2.1先创建指针结构体
- 2.2创建单链表头结点
- 2.3头插法创建元素
- 2.4尾插法创建元素
- 3.插入元素
- 3.1按位置插入元素
- 4.查找元素
- 4.1按位置查找元素
- 4.2按数值查找位置
- 5.删除元素
- 5.1按位置删除元素
- 6.显示全部单链表元素
- 7.库函数
- 8.全部代码
1.创建菜单
void menu(){
printf("\t\t\t----------------单链表---------------------\n");
printf("\t\t\t1.创建单连表 \n");
printf("\t\t\t2.添加元素 \n");
printf("\t\t\t3.查询元素 \n");
printf("\t\t\t4.删除元素 \n");
printf("\t\t\t5.退出 \n");
printf("\t\t\t请输入你的选择:");
}
2.创建单链表
2.1先创建指针结构
//结构体
typedef struct Node{
ElemType data;
struct Node *next;
}Node,*Linklist;
2.2创建单链表头结点
Status InitList(Linklist *L) //初始化产生头结点
{
*L=(Linklist)malloc(sizeof(Node));
if(!(*L))
return FALSE;
(*L)->next=NULL;
return OK;
}
2.3头插法创建元素
void CreateListHead(Linklist *L,int n) //头插法添加元素
{
Linklist p;
srand(time(0));
int i;
for(i=0;i<n;i++)
{
p=(Linklist)malloc(sizeof(Node));
p->data=rand()%100+1;
p->next=(*L)->next;
(*L)->next=p;
}
}
2.4尾插法创建元素
void CreateListTail(Linklist *L,int n) //尾插法添加元素
{
Linklist p,r;
srand(time(0));
r=*L;
for(int i=0;i<n;i++)
{
p=(Linklist)malloc(sizeof(Node));
p->data=rand()%100+1;
p->next=r->next;
r->next=p;
r=p;
}
r->next=NULL;
}
3.插入元素
3.1按位置插入元素
Status ListInsert(Linklist *L,int i,ElemType *e) //按位置插入数据
{
Linklist p,q;
int j=1;
p=*L;
while(p&&i>j) //如果输入i的值给单链表的长度还要大于,意思就是不是插在最后,而是插在比最后还要多一位。
{ //此时p->next=NULL
p=p->next;
++j; //while---if:这个两个不能调位置,不然起不了效果
}
if(!p||j>i) //p->data=NULL==1
{
printf("输入有误!请重新输入:\n");
return FALSE;
}
q=(Linklist)malloc(sizeof(Node));
q->data=*e;
q->next=p->next;
p->next=q;
return OK;
}
4.查找元素
4.1按位置查找元素
Status LocateElem1(Linklist L,int i) //1.输入位置查找数据
{
int j=1;
Linklist p;
p=L;
while(p&&i>j) //while---if:这个两个不能调位置,不然起不了效果 。
{
p=p->next;
++j;
}
if(!p||j>i)
{
printf("输入有误!请重新输入:\n");
return FALSE;
}
printf("第%d个=[%d]\n\n",i,p->next->data);
}
4.2按数值查找位置
Status LocateElem2(Linklist L,ElemType e) //2.输入数据查找位置
{
Linklist p=L->next;
int i=1;
while(p)
{
if(p->data==e)
return i;
p=p->next;
++i;
}
printf("单链表中没有%d,请重新输入。\n",e);
return ERROR;
}
5.删除元素
5.1按位置删除元素
Status ListDelete(Linklist *L,int i,ElemType *e) //输入位置删除元素
{
Linklist p,q; //创建两个指针
int j=1;
p=*L;
while(p&&i>j)
{
p=p->next;
++j;
}
if(!p||j>i)
{
printf("输入有误,请重新输入!\n");
return ERROR;
}
q=p->next;
*e=q->data;
p->next=q->next;
free(q);
return OK;
}
6.显示全部单链表元素
Status ListTraverse(Linklist L) //显示出全部数据
{
Linklist p;
p=L->next;
int i=1;
while(p)
{
printf("第%2d个->data=[%d]\n",i,p->data);
p=p->next;
i++;
}
printf("\n");
return OK;
}
7.库函数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<ctype.h>
#include<math.h>
#include<string.h>
#define TRUE 1
#define OK 1
#define FALSE 0
#define ERROR 0
typedef int ElemType;
typedef int Status;
//结构体
typedef struct Node{
ElemType data;
struct Node *next;
}Node,*Linklist;
Linklist L; //这个是全局变量,不能缺少
8.全部代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<ctype.h>
#include<math.h>
#include<string.h>
#define TRUE 1
#define OK 1
#define FALSE 0
#define ERROR 0
typedef int ElemType;
typedef int Status;
//结构体
typedef struct Node{
ElemType data;
struct Node *next;
}Node,*Linklist;
Linklist L; //这个是全局变量
Status InitList(Linklist *L) //初始化产生头结点
{
*L=(Linklist)malloc(sizeof(Node));
if(!(*L))
return FALSE;
(*L)->next=NULL;
return OK;
}
void CreateListHead(Linklist *L,int n) //头插法添加元素
{
Linklist p;
srand(time(0));
int i;
for(i=0;i<n;i++)
{
p=(Linklist)malloc(sizeof(Node));
p->data=rand()%100+1;
p->next=(*L)->next;
(*L)->next=p;
}
}
void CreateListTail(Linklist *L,int n) //尾插法添加元素
{
Linklist p,r;
srand(time(0));
r=*L;
for(int i=0;i<n;i++)
{
p=(Linklist)malloc(sizeof(Node));
p->data=rand()%100+1;
p->next=r->next;
r->next=p;
r=p;
}
r->next=NULL;
}
Status ListInsert(Linklist *L,int i,ElemType *e) //按位置插入数据
{
Linklist p,q;
int j=1;
p=*L;
while(p&&i>j) //如果输入i的值给单链表的长度还要大于,意思就是不是插在最后,而是插在比最后还要多一位。
{ //此时p->next=NULL
p=p->next;
++j; //while---if:这个两个不能调位置,不然起不了效果
}
if(!p||j>i) //p->data=NULL==1
{
printf("输入有误!请重新输入:\n");
return FALSE;
}
q=(Linklist)malloc(sizeof(Node));
q->data=*e;
q->next=p->next;
p->next=q;
return OK;
}
Status LocateElem1(Linklist L,int i) //1.输入位置查找数据
{
int j=1;
Linklist p;
p=L;
while(p&&i>j) //while---if:这个两个不能调位置,不然起不了效果 。
{
p=p->next;
++j;
}
if(!p||j>i)
{
printf("输入有误!请重新输入:\n");
return FALSE;
}
printf("第%d个=[%d]\n\n",i,p->next->data);
}
Status LocateElem2(Linklist L,ElemType e) //2.输入数据查找位置
{
Linklist p=L->next;
int i=1;
while(p)
{
if(p->data==e)
return i;
p=p->next;
++i;
}
printf("单链表中没有%d,请重新输入。\n",e);
return ERROR;
}
Status ListDelete(Linklist *L,int i,ElemType *e) //输入位置删除元素
{
Linklist p,q; //创建两个指针
int j=1;
p=*L;
while(p&&i>j)
{
p=p->next;
++j;
}
if(!p||j>i)
{
printf("输入有误,请重新输入!\n");
return ERROR;
}
q=p->next;
*e=q->data;
p->next=q->next;
free(q);
return OK;
}
Status ListTraverse(Linklist L) //显示出全部数据
{
Linklist p;
p=L->next;
int i=1;
while(p)
{
printf("第%2d个->data=[%d]\n",i,p->data);
p=p->next;
i++;
}
printf("\n");
return OK;
}
void menu(){
printf("\t\t\t----------------单链表---------------------\n");
printf("\t\t\t1.创建单连表 \n");
printf("\t\t\t2.添加元素 \n");
printf("\t\t\t3.查询元素 \n");
printf("\t\t\t4.删除元素 \n");
printf("\t\t\t5.退出 \n");
printf("\t\t\t请输入你的选择:");
}
int main(){
char ans='y';
InitList(&L);
while(ans=='Y'||ans=='y'){
menu();
int choose;
scanf("%d",&choose);
switch(choose){
case 1:{
int i,n;
printf("本程序提供两种创建单链表方式 1.头插法创建 ,2.尾插法创建。\n");
printf("请输入(1/2):");
scanf("%d",&i);
if(i==1){
printf("请输入创建多少位单链表:");
scanf("%d",&n);
CreateListHead(&L,n); //头插法
}
else if(i==2 ) {
printf("请输入创建多少位单链表:");
scanf("%d",&n);
CreateListTail(&L,n); //尾插法
}
else
printf("输入有误!");
ListTraverse(L);
break;
}
case 2:{
int i,e;
printf("请输入你想插入数据的位置:");
scanf("%d",&i);
printf("请输入数据:");
scanf("%d",&e);
ListInsert(&L,i,&e); //按位值插入
ListTraverse(L);
break;
}
case 3:{
int choose;
printf("本程序提供两种查询方法 1.按位置查找元素。2.输入元素查找位置。\n");
printf("请输入(1/2):");
scanf("%d",&choose);
switch(choose){
case 1:{
int i;
printf("请输入该元素位置:");
scanf("%d",&i);
LocateElem1(L,i); //按位置查询元素
break;
}
case 2:{
int result,e;
printf("请输入元素的数据:");
scanf("%d",&e);
result=LocateElem2(L,e);
if(result)
printf("元素 %d 位于 %d",e,result);
break;
}
default:{
printf("输入有误!");
break;
}
}
break;
}
case 4:{
int i,e;
printf("请输入你想删除的元素位置:");
scanf("%d",&i);
ListDelete(&L,i,&e); //按位置删除元素
if(e)
{
printf("删除第%d个的元素值为:%d\n",i,e);
printf("删除后的单链表:\n");
ListTraverse(L);
}
break;
}
default:{
printf("退出成功。再见!!!");
break;
}
}
if(choose>0 && choose<5){
printf("\n是否继续,如果'是'请输入(Y/y),'否'请输入任意值:");
scanf("%s",&ans);
}else{
break;
}
}
}
9.结果显示