带头结点的单链表实现
#include <stdio.h>
#include <stdlib.h>
#define null NULL
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
} node,*LinkList;
bool InitList(LinkList *L){
*L=(node*)malloc(sizeof(node));
if(*L==null){
return false;
}
(*L)->data=null;
(*L)->next=null;
return true;
}
bool IsEmpty(LinkList L){
if(L->next=null){
return true;
}else{
return false;
}
}
bool CreateFromHead(LinkList L){
node *tem;
int flag=1;
ElemType ch;
while(flag){
scanf("%d",&ch);
if(ch!=9999){
tem=(node*)malloc(sizeof(node));
if(tem==null){
return false;
}
tem->data=ch;
tem->next=L->next;
L->next=tem;
return true;
} else{
flag=0;
}
}
return true;
}
bool CreateFromTail(LinkList L){
node *tem;
node *p=L;
int flag=1;
ElemType ch;
while(flag){
scanf("%d",&ch);
if(ch!=9999){
tem=(node*)malloc(sizeof(node));
if(tem==null){
return false;
}
tem->data=ch;
tem->next=p->next;
p->next=tem;
p=p->next;
}
else{
p->next=null;
flag=0;
}
}
return true;
}
bool PrintList(node* L){
if(L==null){
printf("error\n");
return false;
}
node *tem;
tem=L->next;
ElemType e;
while(tem!=null){
e=tem->data;
tem=tem->next;
printf("%d ",e);
}
printf("\n");
return true;
}
bool GetElem(LinkList L,int index,ElemType *e){
int i=1;
node *tem=L->next;
if(index<1||L==null){
return false;
}
while(i<index&&tem!=null){
tem=tem->next;
i++;
}
if(i==index){
*e=tem->data;
return true;
}
else{
*e=-1;
return false;
}
}
bool LocalElem(LinkList L,int *index,ElemType e){
node *tem=L->next;
if(L==null){
return false;
}
int i=1;
while(tem->data!=e&&tem!=null){
tem=tem->next;
i++;
}
if(tem->data==e){
*index=i;
return true;
}else{
*index=-1;
return false;
}
}
bool InsertList(LinkList L,int index,ElemType e){
int i=0;
node *tem=L;
node *p;
if(L==null){
return false;
}
while(i<index-1&&tem!=null){
tem=tem->next;
i++;
}
if(tem==null){
return false;
}
p=(node*)malloc(sizeof(node));
if(p==null){
return false;
}
p->data=e;
p->next=tem->next;
tem->next=p;
return true;
}
bool DelList(LinkList L,int index,ElemType *e){
int i=1;
node *tem=L->next;
if(L==null){
return false;
}
while(i<index-1&&tem==null){
tem=tem->next;
i++;
}
if(tem==null){
return false;
}
node *p;
p=tem->next;
tem->next=p->next;
*e=p->data;
return true;
}
bool ReverseList(LinkList L){
node *tem=L->next;
LinkList NewList;
if(InitList (&NewList)){
node *p;
while(tem!=null){
p=tem;
NewList->next=tem;
tem=tem->next;
}
return true;
}
else{
return false;
}
}
int main(){
LinkList L;
InitList(&L);
if(IsEmpty(L)){
printf("OK");
}
CreateFromTail(L);
PrintList(L);
ElemType e;
LocalElem(L,&e,2);
printf("%d\n",e);
InsertList(L,1,99);
PrintList(L);
DelList(L,1,&e);
printf("%d",e);
return 0;
}