|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#include <stdlib.h>
/***********************************/
//DATA DEFINITION
typedef struct Node
{
struct Node * pFore; //用来指向前面的节点
int No;//作为数据区,保存节点的编号
struct Node * pNext;//用来指向后一个节点;
} NODE, *PNODE;
/**********************************/
//FUNCTION DECLARATION
PNODE createNode() //创建一个节点,如果创建失败,则返回NULL,如果成功则完成初始化;
{
PNODE _node = (PNODE) malloc(sizeof(NODE));//动态分配一块内存,将地址赋给_node;
if(NULL == _node) //如果_node为空,则返回NULL,函数终止
{
puts("failed to create Node!");//打印字符串,显示错误信息;
return NULL;
}
_node->No = 0; //编号赋值为0;
_node->pFore = NULL;//将两个指针赋值为NULL;
_node->pNext = NULL;
return _node;
}
PNODE createLink(int num) //用来创建一个链表,根据输入参数创建有效元素
{
PNODE header = createNode();//创建头结点,
PNODE nextNode = header;//创建一个游标
if(0 > num)
{
puts("非法输入!");
exit(-1);//直接终止函数
}
if(0 == num) //如果参数为0,则只创建头结点;
{
puts("只创建了头结点!");
return header;
}
for(int i = 0; i < num; i++)//如果参数不为0,则创建num个节点;
{
nextNode->pNext = createNode();//游标的下一个元素指向新创建的节点
nextNode->pNext->pFore = nextNode;//将新创建的节点的pFore指向前一个节点;
nextNode = nextNode->pNext; //将游标指向新创建的节点;
}
return header;
}
void browseLink(PNODE header)
{
PNODE indicator = header;
if(NULL == indicator->pNext)
{
puts("空链表,终止遍历!");
return;
}
int i = 0;
while(NULL != indicator)
{
printf("第%d节点的地址是%#X\n", i, indicator);//显示当前节点的地址
// printf("当前节点的下一个节点的地址是%#X\n", indicator->pNext);
// printf("从下一个节点得到当前节点的地址是%#X\n", indicator->pNext->pFore);
indicator = indicator->pNext;
i++;
// printf("%#X\n",indicator->pFore);
}
return;
}
int getLength(PNODE header) //根据头结点,判断当前链表的元素个数;
{
PNODE indicator = header;
int count = 0;
while(NULL != indicator->pNext)
{
indicator = indicator->pNext;
count++;
}
return count;
}
PNODE findNode(PNODE header, int position)//根据指定序号,找到序号节点的地址;
{
int length = getLength(header);
if(0 > position || length < position)
{
puts("位置参数有误!");
exit(-1);
}
PNODE targetNode = header;
for(int i = 0; i < position; i++)
{
targetNode = targetNode->pNext;
}
return targetNode;
}
bool insertNode(PNODE header, int position)//在position位置的后面插入一个节点;
{
int length = getLength(header);
if(0 > position || length < position)
{
puts("位置不对,无法操作!");
return false;
}
PNODE targetNode = findNode(header, position);
printf("要在%d后面插入一个新节点,当前节点的地址是%#X\n", position, targetNode );
PNODE newNode = createNode();
newNode->pFore = targetNode;
newNode->pNext = targetNode->pNext;
targetNode->pNext = newNode;
return true;
}
bool deleteNode(PNODE header, int position)
{
if(0 > position || (getLength(header)) < position)
{
puts("序号参数不对,操作终止!");
return false;
}
if(0 == position)
{
puts("头结点不能删除!");
return false;
}
PNODE targetNode = findNode(header, position);
if(NULL == targetNode->pNext)
{
puts("要删除的节点为最后一个节点");
targetNode->pFore->pNext = NULL;
free(targetNode);
return true;
}
targetNode->pNext->pFore = targetNode->pFore;
targetNode->pFore->pNext = targetNode->pNext;
free(targetNode);
return true;
}
/**********************************************/
//MAIN FUNCTION
int main(int argc, char *argv[])
{
PNODE header;
header = createLink(4);
browseLink(header);
printf("%d\n", getLength(header));
insertNode(header, 4);
browseLink(header);
puts("*****************");
deleteNode(header, 4);
browseLink(header);
return 0;
}
|
|