带头结点和不带头结点的需要注意在元素前插入和删除元素时的判断(while(head->next !=NULL))
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
int no;
char name[31];
}ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LNode *InitList1();
int PushFront(LinkList LL, ElemType *ee);
int PushBack(LinkList LL, ElemType *ee);
void PrintList(LinkList LL);
void InsertForwardElem(LinkList LL,int number,ElemType *ee);
void InsertBehindElem(LinkList LL,int number,ElemType *ee);
void deleteElem(LinkList LL,int number);
void ChangeData(LinkList LL,int data1,int data2);
void ClearList(LinkList LL);
void DestroyList(LinkList LL);
void ReverseLink(LinkList LL);
int main()
{
LNode* LL = NULL;
LL = InitList1();
ElemType ee;
char name[256]={0};
for(int i=1;i<=10;i++)
{
char name[256]={0};
sprintf(name,"hcc[%d]",i);
ee.no=i;strcpy(ee.name,name);
// PushFront(LL,&ee);
PushBack(LL,&ee);
}
PrintList(LL);
ee.no=100;strcpy(ee.name,"zhangsan");
//InsertForwardElem(LL,0,&ee);
//InsertBehindElem(LL,10,&ee);
//deleteElem(LL,10);
printf("\n\nreverseLink\n\n");
ReverseLink(LL);
PrintList(LL);
ChangeData(LL,10,1000);
PrintList(LL);
ClearList(LL);
DestroyList(LL);
LL = NULL;
printf("LL =NULL\n");
PrintList(LL);
return 0;
}
LNode *InitList1()
{
LNode* head = (LNode*)malloc(sizeof(LNode));
if(head == NULL)
return NULL;
head->next=NULL;
return head;
}
int PushFront(LinkList LL, ElemType *ee)
{
if(LL==NULL||ee==NULL) return -1;
LNode* tmp = (LNode*)malloc(sizeof(LNode));
memcpy(&tmp->data,ee,sizeof(ElemType));
tmp->next = LL->next;
LL->next = tmp;
return 0;
}
int PushBack(LinkList LL, ElemType *ee)
{
if(LL==NULL||ee==NULL) return -1;
LNode* tmp = (LNode*)malloc(sizeof(LNode));
memcpy(&tmp->data,ee,sizeof(ElemType));
while(LL->next !=NULL)
{
LL=LL->next;
}
LL->next = tmp;
tmp->next = NULL;
return 0;
}
void PrintList(LinkList LL)
{
if(LL == NULL) return;
LNode* tmp =LL->next;
while(tmp !=NULL)
{
printf("no:%d name:%s\n",tmp->data.no,tmp->data.name);
tmp = tmp->next;
}
return ;
}
void InsertForwardElem(LinkList LL,int number,ElemType *ee)
{
if(LL->next == NULL)
{
printf("not enough data\n");
return ;
}
while(LL->next!=NULL)
{
if(LL->next->data.no == number)
{
LNode* tmp = (LNode*)malloc(sizeof(LNode));
memcpy(&tmp->data,ee,sizeof(ElemType));
tmp->next = LL->next;
LL->next = tmp;
return;
}
LL = LL->next;
}
printf("no this data\n");
return;
}
void InsertBehindElem(LinkList LL,int number,ElemType *ee)
{
if(LL->next == NULL)
{
printf("not enough data\n");
return ;
}
while(LL->next!=NULL)
{
if(LL->next->data.no == number)
{
LNode* tmp = (LNode*)malloc(sizeof(LNode));
memcpy(&tmp->data,ee,sizeof(ElemType));
tmp->next = LL->next->next;
LL->next->next = tmp;
return;
}
LL = LL->next;
}
printf("no this data\n");
return;
}
void deleteElem(LinkList LL,int number)
{
if(LL->next == NULL)
{
printf("not enough data\n");
return ;
}
while(LL->next!=NULL)
{
if(LL->next->data.no == number)
{
LNode* tmp = LL->next;
LL->next = LL->next->next;
free(tmp);
return;
}
LL = LL->next;
}
printf("no this data\n");
return;
}
void ClearList(LinkList LL)
{
LNode* tmp1 = LL->next;
LNode* tmp2 =NULL;
while(tmp1 !=NULL)
{
tmp2 = tmp1->next;
free(tmp1);
tmp1 = tmp2;
}
LL->next =NULL;
printf("LL->next =NULL\n");
}
void DestroyList(LinkList LL)
{
LNode* tmp = NULL;
while(LL !=NULL)
{
tmp = LL->next;
free(LL);
LL = tmp;
}
//LL =NULL; LOCAL VAR SO NEED TO BE NULL OUTSIDE
}
void ChangeData(LinkList LL,int data1,int data2)
{
if(LL==NULL || LL->next ==NULL) return;
while(LL->next!=NULL)
{
if(LL->next->data.no == data1)
{
LL->next->data.no = data2;
return;
}
LL = LL->next;
}
printf("no this data\n");
}
void ReverseLink(LinkList LL)
{
if(LL->next ==NULL) return;
LNode* tmp =LL->next;
LNode* tmpnext;
LL->next= NULL;
while(tmp != NULL)
{
tmpnext = tmp->next;
tmp->next = LL->next;
LL->next = tmp;
tmp = tmpnext;
}
return ;
}