1、单链表注意后面插入的情况,如果是最后一个元素,那么它没有下一个节点的前驱;
2、插入:(1)先写该节点的前驱和后继;
(2)再写该节点的前驱的后继;
(3)在写该节点的后继的前驱;
3、删除:(1)注意最后一个节点,如果是最后一个节点,它没有后继的前驱
(2)如果是中间节点,写前驱的后继和后继的前驱;
#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;
struct LNode *prior;
}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);
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,5,&ee);
// PrintList(LL);
// InsertBehindElem(LL,11,&ee);
// PrintList(LL);
deleteElem(LL,10);
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;
head->prior=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;
tmp->prior = LL;
if(LL->next != NULL) tmp->next->prior = tmp;
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;
}
tmp->next=LL->next;
tmp->prior = LL;
LL->next =tmp;
return 0;
}
void PrintList(LinkList LL)
{
if(LL == NULL) return;
LNode* tmp =LL->next;
while(tmp !=NULL)
{
printf("tmp:%p tmp.prior=%p tmp.next =%p no:%d name:%s\n",tmp,tmp->prior,tmp->next,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;
tmp->prior = LL;
LL->next = tmp;
tmp->next->prior = 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;
tmp->prior = LL->next;
if(LL->next->next !=NULL) tmp->next->prior = tmp;
LL->next->next = tmp;
return;
}
LL = LL->next;
}
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;
tmp->prior->next = tmp->next;
if(tmp->next!=NULL) tmp->next->prior = LL;
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");
}