#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct LNode *next;
}LNode,*Linklist;
//头插法
Linklist head_InitList(Linklist &L){
printf("请依次输入你要插入的元素:");
LNode *s;
int data;
L = (LNode*)malloc(sizeof(LNode));
L->next=NULL;
scanf("%d",&data);
while(data!=9999){
s = (LNode*)malloc(sizeof(LNode));
s->next=L->next;
s->data=data;
L->next=s;
scanf("%d",&data);
}
return L;
}
//尾插法
Linklist tail_InitList(Linklist &L){
printf("请依次输入你要插入的元素:");
int data;
L = (LNode*)malloc(sizeof(LNode));
LNode *s,*r=L;
scanf("%d",&data);
while(data!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=data;
r->next=s;
r=s;
scanf("%d",&data);
}
r->next=NULL;
return L;
}
//求表长
void Length(Linklist L){
int a=0;
LNode *p;
p=L;
while(p->next!=NULL)
{
a+=1;
p=p->next;
}
printf("该单链表的表长为:%d\n",a);
}
//按值查找操作
LNode *LocateElem(LNode *L,int e){
/*
LNode *s;
s=L;
while(s){
if(s->data==e) break;
else s=s->next;
}
return s;
*/
LNode *p=L->next;
while(p&&p->data!=e) p=p->next;
return p;
}
//按位查找操作
LNode *GetElem(Linklist L,int i){
LNode *p;
p=L->next;
if (i==0) return L;
if (i<0) return NULL;
for(int j=1;j<i;j++) p=p->next;
return p;
}
//插入操作
Linklist ListInsert(Linklist &L,int i,int e){
LNode *p,*s;
p=GetElem(L,i-1);
s->next=p->next;
p->next=s;
s->data=e;
}
//按位删除操作
Linklist ListDelete(Linklist &L,int i){
LNode *p,*s;
p=GetElem(L,i-1);
s=p->next;
p->next=p->next->next;
free(s);
}
//输出操作
void PrintList(Linklist L){
LNode *p;
p=L->next;
printf("该链表为:");
while(p!=NULL){
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
}
//判空操作
void Empty(Linklist L){
if(L->next!=NULL){
printf("链表不为空\n");
}
else{
printf("链表为空\n");
}
}
//销毁链表操作
void DestroyList(Linklist &L){
LNode *p;
while(L->next){
p=L->next;
L->next=p->next;
free(p);
}
}
int main(){
int score;
Linklist L;
int e,i;
LNode *p;
while(1){
printf("请输入你的case:\n1:头插法\n2:尾插法\n3:输出\n4:求表长:\n5:判断空链表\n6:销毁链表\n7:按值查找\n8:按位查找\n9:插入操作\n10:删除操作\n");
printf("你的选择是:");
scanf("%d",&score);
switch(score){
case 1:head_InitList(L);break;
case 2:tail_InitList(L);break;
case 3:PrintList(L);break;
case 4:Length(L);break;
case 5:Empty(L);break;
case 6:DestroyList(L);break;
case 7:scanf("%d",&e);p=LocateElem(L,e);printf("找到该节点为:%d\n",p->data); break;
case 8:scanf("%d",&e);GetElem(L,i);break;
case 9:scanf("%d",&i);scanf("%d",&e);ListInsert(L,i,e);break;
case 10:scanf("%d",&i);ListDelete(L,i);break;
default:break;
}
}
return 0;
}