鱼C论坛

 找回密码
 立即注册
查看: 3182|回复: 0

一个简单的链表,请大家指正

[复制链接]
发表于 2013-3-17 22:51:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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;
}
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-5 12:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表