#include <stdlib.h>
#include <stdio.h>
#define OK 1
#define FALSE 0
#define ERROR -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode //链表结点定义
{
//请你补充
ElemType data;
struct LNode *next;
}LNode, *LinkList;
//功能:初始化单链表,即生成只有表头的单链表,成功返回OK,否则返回ERROR
Status InitLinkList_L(LinkList &L)
{
//请你补充
L= new Lnode;
L->next=NULL;
return OK;
}
//功能:查询链表L的第i个位置上是否存在元素,存在返回OK,否则返回ERROR,找到的数据存放到变量e中
Status GetElem_L(LinkList L, int i, ElemType &e)
{
//请你补充
p=L->next;j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i) return ERROR;
e=p->data;
return OK;
}
//功能:向链表L的第i个位置插入一个数据e,插入成功返回OK,否则返回ERROR
Status ListInsert_L(LinkList &L, int i, ElemType e)
{
//请你补充
p=L;j=0;
while(p && (j<n-1))
{
p=p->next;
++j;
}
if(!p||(j>i-1))
return ERROR;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
//功能:将链表L的第i个位置删除,删除的值保存到e,删除成功返回OK,否则返回ERROR
Status ListDelete_L(LinkList &L, int i, ElemType &e)
{
//请你补充
p=L;j=0;
while((p->next)&&(j<i-1))
{
p=p->next;++j;
}
if(!(p->next)||(j>i-1))
return ERROR;
q=p->next;
p->next=q->next;
delete q;
return OK;
}
//功能:求链表L的长度,返回链表L的长度
int ListLength_L(LinkList L)
{
//请你补充
int count=0;
Linklist*p=L->next;
while(p){
p=p->next;
++count;
}
return count;
}
//功能:依次输出链表L的每个数据
void OutputList_L(LinkList L)
{
//请你补充,并请调用ListLength_L输出链表长度
}
//功能:依次清除链表L的每个数据,并释放相应的空间,清除成功,返回OK,否则ERROR
Status ClearLis_L(LinkList &L)
{
//请你补充
return OK;
}
//功能:向单链表中输入n个数据,成功返回OK,否则返回ERROR
Status InputData_L(LinkList &L, int n)
{
int i;
LinkList tail, p;
L = (LinkList) malloc (sizeof (LNode));
if(!L)
return ERROR;
L->Next = NULL;
tail = NULL;
for(i = 1; i <= n; i++)
{
p = (LinkList) malloc (sizeof (LNode));
if(!p)
return ERROR;
printf("\n第%d个数据为:", i);
scanf("%d", &p->Data); // 输入元素值
p->Next = NULL;
if(i == 1)
L->Next = p;
else
tail->Next = p;
tail = p;
}
return OK;
}
void ShowMenu() //主菜单
{
printf("\n");
printf("\n****************单链表(头插法)数据操作****************\n\n");
printf("\t\t1 链表数据输出\n\n");
printf("\t\t2 链表数据插入\n\n");
printf("\t\t3 链表数据删除\n\n");
printf("\t\t4 链表数据查询\n\n");
printf("\t\t5 链表数据清空\n\n");
printf("\t\t6 链表数据输入\n\n");
printf("\t\t0 退出系统\n\n");
printf("****************单链表(头插法)数据操作****************\n");
printf("\n");
}
//功能:菜单2的操作处理,实现:在单链表的第i个位置插入数据e的操作
void SubMenu2(LinkList &L)
{
int i;
ElemType e;
printf("插入位置:");
scanf("%d", &i);
printf("插入的数据:");
scanf("%d", &e);
if(ListInsert_L(L, i, e) == OK)
printf("在单链表L的第 %d 位置成功插入数据 %d .\n", i, e);
else
printf("插入位置:%d 错误!\n", i);
}
//功能:菜单3的操作处理,实现:在单链表的第i个位置删除数据e的操作
void SubMenu3(LinkList &L)
{
//ListDelete_L
int i;
ElemType e;
printf("删除位置:");
scanf("%d", &i);
if(ListDelete_L(L, i, e) == OK)
printf("在单链表L的第 %d 位置成功删除数据 %d .\n", i, e);
else
printf("删除位置:%d 错误!\n", i);
}
//菜单3的操作处理,实现:查询单链表的第i个位置数据的操作
void SubMenu4(LinkList L)
{
int i;
ElemType e;
printf("查询位置:");
scanf("%d", &i);
if(GetElem_L(L, i, e) == OK)
printf("单链表L的第 %d 个位置的数据:%d\n", i, e);
else
printf("单链表L的第 %d 个位置的数据不存在!\n", i);
}
//功能:菜单6的功能,实现:输入数据到链表中去
void SubMenu6(LinkList &L)
{
int n;
printf("数据个数:");
scanf("%d", &n);
if(InputData_L(L, n) == ERROR)
exit(0);
}
void main()
{
int choice = 0; //用户功能选择
LinkList L;
InitLinkList_L(L); //初始化单链表
while(1)
{
system("CLS");
ShowMenu();
printf("Please choose(请选择): ");
scanf("%d",&choice);
switch(choice)
{
case 1:
{
OutputList_L(L); //调用输出函数对链表的数据进行输出
fflush(stdin);
system("pause");
break;
}
case 2:
{
SubMenu2(L); //调用菜单2功能,实现数据的插入操作
fflush(stdin);
system("pause");
break;
}
case 3:
{
SubMenu3(L);
fflush(stdin);
system("pause");
break;
}
case 4:
{
SubMenu4(L);
getchar(); getchar(); system("CLS");
break;
}
case 5:
{
ClearLis_L(L);
fflush(stdin);
system("pause");
break;
}
case 6:
{
printf("输入新数据会先清除旧数据!\n");
ClearLis_L(L);
SubMenu6(L);
fflush(stdin);
system("pause");
break;
}
case 0:
{
system("CLS");
printf("谢谢使用!\n");
exit(0);
}
default:
{
printf("功能选择错误,只能选择0-6!\n");
fflush(stdin);
system("pause");
}
}
}
}