#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode, *LinkList;
bool CreateList(LinkList &Lhead, int n){
Lhead = (LinkList)malloc(sizeof(LNode));
Lhead->next = NULL;
for(int i = n; i > 0; i--){
LinkList p = (LinkList)malloc(sizeof(LNode));
scanf("%d", &p->data);
p->next = Lhead->next;
Lhead->next = p;
}
return true;
}
bool GetElem(LinkList Lhead, int i, Elemtype &e){
LinkList p = Lhead->next;
int j = 1;
while(p && j < i){
p = p->next;
j++;
}
if(!p || j > i)
return false;
e = p->data;
return true;
}
void OutputList(LinkList Lhead){
LinkList p = Lhead->next;
while(p != NULL){
printf("%d ", p->data);
p = p->next;
}
printf("\n输出完毕!\n");
}
void Opposite_OutputList(LinkList Lhead){
if(NULL == Lhead)
return ;
else{
Opposite_OutputList(Lhead->next);
printf("%d ", Lhead->data);
}
}
bool LisiInsert(LinkList &Lhead, int i, Elemtype e){
LinkList p = Lhead;
int j = 0;
while(p && j < i-1){
p = p->next;
j++;
}
if(!p || j > i-1)
return false;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool InsertToHead(Elemtype e, LinkList &Lhead){
LinkList p =(LinkList)malloc(sizeof(LNode));
if(!p){
printf("插入失败!\n");
return false;
}
p->data = e;
p->next = Lhead->next;
Lhead->next = p;
return true;
}
bool InsertToTail(Elemtype e, LinkList &Lhead){
LinkList p = (LinkList)malloc(sizeof(LNode));
if(p == NULL){
printf("插入失败\n");
return false;
}
p->data = e;
p->next = NULL;
LinkList q = Lhead;
while(q->next != NULL){
q = q->next;
}
q->next = p;
return true;
}
bool ListDelete(LinkList &Lhead, int i, Elemtype &e){
LinkList p = Lhead;
LinkList q;
int j = 0;
while(p->next && j < i-1){
p = p->next;
j++;
}
if(!(p->next) || j > i-1)
return false;
q = p->next;
p->next = q->next;
e = q->data;
free(q);
return true;
}
int LinkListLength(LinkList Lhead){
int length = 0;
LinkList p = Lhead->next;
while(p){
length++;
p = p->next;
}
return length;
}
int main(){
int i, e = 0;
LinkList Lhead;
printf("请输入你想创建的链表长度:\n");
int x;
scanf("%d", &x);
printf("请输入%d个元素:\n", x);
if(CreateList(Lhead, x))
printf("链表已经创建好了,请选择你想进行的操作:\n");
printf("1:在某个位置插入元素 2:头插法插入元素 3:尾插法插入元素 \n4:计算链表长度,5:删除某个节点");
printf("6:求某个节点的值 \n7:正序输出链表的值 8:逆序输出链表的值 0:退出\n");
int n;
while(scanf("%d", &n) && n != 0){
switch(n){
case 1:
printf("请输入你想插入元素e和位置i:\n");
scanf("%d %d", &e, &i);
if(LisiInsert(Lhead, i, e) == true)
printf("插入成功!\n");
else
printf("插入失败!\n");
break;
case 2:
printf("请输入你想插入元素e:\n");
scanf("%d", &e);
if(InsertToHead(e, Lhead) == true)
printf("元素%d插入成功!\n", e);
break;
case 3:
printf("请输入你想插入元素e:\n");
scanf("%d", &e);
if(InsertToTail(e, Lhead) == true)
printf("元素%d插入成功!\n", e);
break;
case 4:
printf("链表的节点个数是:%d\n", LinkListLength(Lhead));
break;
case 5:
printf("请输入你要删除的节点位置:\n");
scanf("%d", &i);
if(ListDelete(Lhead, i, e) == true){
printf("删除成功!\n");
printf("删除的元素是: %d\n", e);
}
else
printf("删除失败!\n");
break;
case 6:
printf("请输入你想获取的元素位置i:\n");
scanf("%d", &i);
if(GetElem(Lhead, i, e) == true)
printf("第%d个位置的元素是:%d\n", i, e);
else
printf("获取失败\n");
break;
case 7:
OutputList(Lhead);
break;
case 8:
Opposite_OutputList(Lhead);
break;
default:
printf("你得输入有误,请重新输入:\n");
break;
}
}
printf("谢谢使用!\n");
return 0;
}
