C语言链表(一)
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
用指针实现双向链表(非循环,表头为空),元素的添加和删除:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct DListElement_
{
void *data;
int num;
struct DListElement_ *ahead;
struct DListElement_ *next;
}DListElement;
DListElement* DList;
//在尾部添加节点(num记录了节点的数量,最多为100)
void AddElement(DListElement* Ele)
{
DListElement* tmp = NULL;
tmp = DList;
while(tmp->next != NULL)
{
tmp = tmp->next;
}
tmp->next = Ele;
Ele->ahead = tmp;
Ele->num = (tmp->num)%100 + 1;
}
//取出DList->next节点
void GetElefromList(DListElement** Ele)
{
DListElement* tmp = NULL;
tmp = DList->next;
if(tmp == NULL)
{
printf("ERR!!!要取的节点内容为空!!!\n\r");
return;
}
#if 1
DList->next = tmp->next;
if(DList->next != NULL)
{
DList->next->ahead = DList;
}
#else //与if 1结果一样
if(tmp->next != NULL)
{
DList->next = tmp->next;
DList->next->ahead = DList;
}
else
{
DList->next = NULL;
}
#endif
*Ele = tmp;
printf("tmp = %d\n\r", tmp);
}
int main()
{
//1. 初始化 DList
DList = (DListElement*)malloc(sizeof(DListElement));
memset(DList, 0x0, sizeof(DListElement));
//----------------------------------------
DListElement Ele1, Ele2;
memset(&Ele1, 0x0, sizeof(DListElement));
memset(&Ele2, 0x0, sizeof(DListElement));
//---------------------------------------
//2. add Ele1
AddElement(&Ele1);
printf("DList = %d\n\r", DList);
printf("DList->next = %d\n\r", (DList->next));
printf("DList->next->next = %d\n\r", (DList->next->next));
printf("Ele1 = %d\n\r", &Ele1);
printf("\n\r");
printf("\n\r");
//3. add Ele2
AddElement(&Ele2);
printf("DList = %d\n\r", DList); //还是原来的头
printf("DList->next = %d\n\r", (DList->next)); //Ele1
printf("DList->next->next = %d\n\r", (DList->next->next)); //Ele2
printf("Ele2 = %d\n\r", &Ele2);
printf("\n\r");
printf("\n\r");
//4. get one element
DListElement* getEle1 = NULL;
GetElefromList(&getEle1);
printf("1---DList = %d\n\r", DList); //还是原来的头
if(DList->next != NULL)
{
printf("1---DList->next = %d\n\r", (DList->next)); //Ele1
}
if(DList->next->next != NULL)
{
printf("1---DList->next->next = %d\n\r", (DList->next->next)); //Ele2
}
printf("1---getEle1 = %d\n\r", getEle1);
printf("1---\n\r");
printf("1---\n\r");
//5. get one element
DListElement* getEle2 = NULL;
GetElefromList(&getEle2);
printf("2---DList = %d\n\r", DList); //还是原来的头
/*if(DList->next != NULL)
{
printf("2---DList->next = %d\n\r", (DList->next));
}
if(DList->next->next != NULL)
{
printf("2---DList->next->next = %d\n\r", (DList->next->next));
}*/
printf("2---getEle2 = %d\n\r", getEle2);
printf("2---\n\r");
printf("2---\n\r");
//6. get one element
DListElement* getEle3 = NULL;
GetElefromList(&getEle3);
printf("3---DList = %d\n\r", DList); //还是原来的头
/*if(DList->next != NULL)
{
printf("3---DList->next = %d\n\r", (DList->next)); //Ele1
}
if(DList->next->next != NULL)
{
printf("3---DList->next->next = %d\n\r", (DList->next->next)); //Ele2
}*/
printf("3---getEle3 = %d\n\r", getEle3);
printf("3---\n\r");
printf("3---\n\r");
printf("\n\rend the main function\n\r");
return 0;
}
以上代码可以在 DEV C++仿真器上直接运行;代码执行结果: