图片描述:
由于采用了引用类型,所以需要用C++来运行实现
,另外还有很多可以精简的地方,欢迎讨论。
我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;//LNode,LinkList都是定义指针变量,习惯前者结点变量,后者单链表
//单链表初始化及初步创建
Status InitList(LinkList &L)
{
LNode *p;
L=(LNode*)malloc(sizeof(LNode*));//1.生成头结点,头指针头结点建立联系
L->next=NULL;//2.头结点指针域置空
p=L;
printf(" 您想创建含几个数据的单链表\n");
int i,j;
scanf("%d",&i);
for(j=1;j<=i;j++)
{
printf("请输入数据\n");
//p=p->next; ???????????????
p=(LNode*)malloc(sizeof(LNode));
p->next=L->next;
L->next=p;
scanf("%d",&p->data);
}
return OK;
}
//单链表的插入(头插法)
Status Insert(LinkList L)
{
int i,j=0;
ElemType e;
LNode *p;
LNode *s;
p=L;//p指向头节点
printf("请输入您想插入的位置和值\n");
scanf("%d %d",&i,&e);
while(p&&j<(i-1))//同时满足为非空或在该位置的前方,j0,i1头结点开
{
p=p->next;
++j;
}
if(!p||j>(i-1))//p是空集(i>n+1),或i<1
return ERROR;
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
//单链表的查找
int LocateElem(LinkList L)
{
ElemType e;
printf("请输入您想查找的值!\n");
scanf("%d",&e);
LNode *p;
p=L->next;//首元节点
int j=1;
while(p&&(*p).data!=e)//当空集或p的数据域是e跳出
{
p=p->next;
j++;
}
if(!p)//p是空集
printf("并未找到该值\n");
else
printf("该值的位置是%d\n",j);
return 0;
}
//单链表的取值
Status GetElem(LinkList L)
{
int i,j=1;
LNode *p;
p=L->next;//p指向首元节点
printf("请输入你想要取值位置!\n");
scanf("%d",&i);
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)//i>单链表长度||i<=0
return ERROR;
printf("该位置的值是%d\n",p->data);
return OK;
}
//单链表的删除
Status ListDelete(LinkList &L)
{
LNode *p,*q;
int i;
int j=0;
printf("请输入你想删除元素的位置\n");
scanf("%d",&i);
p=L;//首元节点
while(p&&j<i-1)//是空集或
{
p=p->next;++j;
}
if(!p||i<1)
return ERROR;
q=p->next;
p->next=q->next;
free(q);
return OK;
}
//单链表的遍历
int TravelList(LinkList L)
{
LNode *p;
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return 0;
}
int main()
{
printf("------------1 建立------------\n");
printf("------------2 插入------------\n");
printf("------------3 查找------------\n");
printf("------------4 取值------------\n");
printf("------------5 删除------------\n");
printf("------------6 遍历------------\n");
printf("------------0 退出------------\n");
int m;
printf("请输入你想要的操作\n");
scanf("%d",&m);
while(m!=0)
{
LinkList L;
switch(m)
{
case 1:
if(InitList (L))
printf("创建成功!\n");
else
printf("创建失败!\n");
break;
case 2:
if(Insert(L))
printf("插入成功!\n");
else
printf("插入失败!\n");
break;
case 3:LocateElem(L);
break;
case 4:GetElem(L);
break;
case 5:
if(ListDelete(L))
printf("删除成功!\n");
else
printf("删除失败!\n");
break;
case 6:TravelList(L);
break;
}
scanf("%d",&m);
}
return 0;
}