#include <stdio.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int num;
char name[20];
int class;
char major[20];
int math;
int chinese;
int english;
}ElemType;
typedef struct st{
ElemType data;
struct st *next;
}LNode,*LinkList;
bool InitList(LinkList *L);
bool Empty(LinkList *L);
bool ListInsertBefore(LinkList *L, int i, ElemType e);
bool InsertNextNode(LNode *p,ElemType e);
bool InsertPriorNode(LNode *p,ElemType e);
bool ListInsertBack(LinkList *L, int i, ElemType e);
bool ListDelete(LinkList *L, int i, ElemType *e);
LinkList List_HeadInsert(LinkList *L,ElemType x);
LinkList List_TailInsert(LinkList *L,ElemType x);
int length(LinkList *L);
LNode * GetElem(LinkList *L, int i);
ElemType input();
void menu();
void show(LinkList *L);
void CreateList(LinkList *L);
int main() {
LinkList q=(LinkList)malloc(sizeof(LNode));
LinkList *L=&q;
InitList(L);
Empty(L);
ElemType e={111,"111",111,"111",111,111,111},a;
ElemType c={222,"111",222,"111",222,111,111};
ElemType d={333,"111",222,"111",222,111,111};
List_TailInsert(L,e);
length(L);
InsertNextNode(GetElem(L,1),e);
GetElem(L,1);
ListDelete(L,1,&a);
ListInsertBack(L,1,c);
InsertPriorNode(GetElem(L,1),d);
ListInsertBefore(L,1,e);
return 0;
}
ElemType input(){
ElemType e;
scanf("%d %s %d %s %d %d %d",&e.num,e.name,&e.class,e.major,&e.math,&e.chinese,&e.english);
return e;
}
bool ListInsertBefore(LinkList *L, int i, ElemType e){
LNode *p = (LNode *) malloc(sizeof(LNode));
p=GetElem(L,i);
if(p==NULL)
return false;
InsertPriorNode(p,e);
return true;
}
bool InsertPriorNode(LNode *p,ElemType e){
if(p==NULL)
return false;
LNode *s = (LNode *) malloc(sizeof(LNode));
s->next=p->next;
p->next=s;
s->data=p->data;
p->data=e;
return true;
}
bool ListInsertBack(LinkList *L, int i, ElemType e){
LNode *p=GetElem(L,i);
if(p==NULL){
return false;
}
InsertNextNode(p,e);
return true;
}
bool InsertNextNode(LNode *p,ElemType e){
LNode *s=(LNode *)malloc(sizeof(LNode));
s->next=p->next;
s->data=e;
p->next=s;
return true;
}
LNode * GetElem(LinkList *L, int i){
if(i<0){
return NULL;
}
int j=0;
LNode *p=*L;
while (p!=NULL&&j<i) {
p=p->next;
j++;
}
return p;
}
bool ListDelete(LinkList *L, int i, ElemType *e){
LNode *p=(LNode *)malloc(sizeof(LNode));
LNode *s=(LNode *)malloc(sizeof(LNode));
p=GetElem(L,i);
if(p==NULL)
return false;
if(p->next==NULL)
return false;
*e=p->data;
p->data=p->next->data;
p->next=p->next->next;
return true;
}
bool InitList(LinkList *L){
(*L)->next=NULL;
return true;
}
bool Empty(LinkList *L){
if ((*L)->next!=NULL)
return false;
else return true;
}
LinkList List_HeadInsert(LinkList *L,ElemType x){
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=(*L)->next;
(*L)->next=s;
return *L;
}
LinkList List_TailInsert(LinkList *L,ElemType x){
LNode *s=(LNode *)malloc(sizeof(LNode));
LNode *r=*L;
s->data=x;
s->next=r->next;
r->next=s;
r=s;
return *L;
}
int length(LinkList *L){
LNode *p=*L;
int len=0;
while (p->next!=NULL){
p=p->next;
len++;
}
return len;
}