基本要求:
(1)实现单链表的创建;(2)实现单链表的插入;(3)实现单链表的删除
(4)实现单链表的查找;(5)实现单链表的显示
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef float ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
//1.头插法创建单链表
void CreateList_T(LinkList &L, Status n)
{
int i;
LinkList p;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for(i = 0;i < n;i++)
{
p = (LinkList)malloc(sizeof(LNode));
printf("请输入该处数据域的值:\n");
scanf("%f", &p->data);
p->next = L->next;
L->next = p;
}
}
//2.尾插法创建单链表
void CreateList_W(LinkList &L, Status n)
{
int i;
LinkList r, p;
r = L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for(i = 0;i < n;i++)
{
p = (LinkList)malloc(sizeof(LNode));
printf("请输入该处数据域的值:\n");
scanf("%f", &p->data);
p->next = NULL;
r->next = p;
r = p;
}
}
//3.打印单链表
void Print(LinkList &L)
{
printf("打印单链表:");
LinkList P;
P=L->next;
while(P!=NULL)
{
printf("%.2f ",P->data);
P=P->next;
}
printf("\n");
}
//4.查找某个位置的元素
Status GetElem(LinkList &L, Status c, ElemType &e)
{
LinkList p;
p = L->next;
Status j = 1;
while (p && j<c)
{
p = p->next;
++j;
}
if ( !p || j > c )
{
return ERROR;
}
e = p->data;
return e;
}
//5.在单链表中插入元素
int ListInsert_L ( LinkList L, int i, ElemType e )
{
LNode *p,*s;
int j;
p = L;
j = 0;
while ( p && j<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;
Print(L);
return OK;
}
//6.在单链表中删除元素
int ListDelete_L ( LinkList L, int i, ElemType *e )
{
LNode *p,*q;
int j;
p = L;
j = 0;
while ( p->next && j < i-1 )
{
p = p->next; ++j;
}
if ( !p || j > i-1 )
{
return ERROR;
}
q = p->next;
p->next = q->next;
*e = q->data;
free (q);
Print(L);
return OK;
}
//主函数
int main()
{
printf("*************************************************\n");
printf(" ***欢迎使用单链表操作程序*** *\n");
printf("功能列表-----------------------------------------\n");
printf("1:打印单链表 *\n");
printf("-------------------------------------------------\n");
printf("2:查找单链表中某个位置的元素 *\n");
printf("-------------------------------------------------\n");
printf("3:在单链表中插入元素 *\n");
printf("-------------------------------------------------\n");
printf("4:在单链表中删除元素 *\n");
printf("-------------------------------------------------\n");
printf("5:退出循环程序 *\n");
printf("-------------------------------------------------\n");
printf(" North University Of China\n");
printf("*************************************************\n");
//先创建一个单链表
LinkList L;
printf("请先创建一个单链表:1.头插法创建 2.尾插法创建\n");
int a, n;
scanf("%d", &a);
if (a == 1)//34
{
printf("请输入要创建的元素个数:");
scanf("%d", &n);
CreateList_T(L, n);
Print(L);
printf("创建完成,请进行后续操作。\n");
}
else if (a == 2)//34
{
printf("请输入要创建的元素个数:");
scanf("%d", &n);
CreateList_W(L, n);
Print(L);
printf("创建完成,请进行后续操作。\n");
}
//选择功能
int num, c;
ElemType e;
while(1)
{
printf("请选择想要进行的操作:\n");
scanf("%d", &num);
if (num == 1)//34
{
Print(L);
}
else if (num == 2)//34
{
printf("请输入要查找第几个元素:\n");
scanf("%d", &c);
GetElem(L, c, e);
printf("元素为%.2f\n", e);
}
else if (num == 3)//34
{
int i;
ElemType e;
printf("请输入插入元素的位置:\n");
scanf("%d", &i);
printf("请输入插入元素的值:\n");
scanf("%f", &e);
ListInsert_L (L, i, e);
}
else if (num == 4)
{
int i;
ElemType e;
printf("请输入删除元素的位置:\n");
scanf("%d", &i);
ListDelete_L (L, i, &e);
}
else if (num == 5)//34
{
printf("***********************加纳~~~********************\n");
break;
}
else
{
printf("Man,hahaha,What can I say......输入不符合要求。\n");
}
}
}