数据结构-实现链表

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/*
若爱,请深爱;若弃,请彻底。不要暧昧,伤人伤己
(1)不应该牺牲程序的可读性

*/

/*
(1)pTail->next = pNew; //新构造的结点挂到指定结点
(2)append_list()函数中:对p->next判空
(3)注意尾结点指针域设置为NULL

*/


//定义数据类型,并为其分配内存
#define NODE_LEN sizeof(NODE)

typedef struct Node
{
 float value;
 struct Node * next;
}* PNODE, NODE;

PNODE create_list(); //构造一个指定长度的链表
void traverse_list(PNODE pHead); //遍历链表
bool append_list(PNODE pHead, float value); //追加结点值
bool insert_list(PNODE pHead, int pos, float value); //指定位置插入结点值


int main(void)
{
 PNODE pHead = NULL; //定义头指针
 printf("pHead指针的内存空间长度:%d \n", sizeof(pHead));

 pHead = create_list();
 
 traverse_list(pHead);
 
 append_list(pHead, 100);
 traverse_list(pHead);

 insert_list(pHead, 2, 80);
 traverse_list(pHead);

 append_list(pHead, 100);
 traverse_list(pHead);

 return 0;
}

PNODE create_list()
{
 int len; //链表的长度
 float value; //临时节点值
 
 printf("请输入链表的长度:");
 scanf("%d", &len);

 PNODE pHead = (PNODE)malloc(NODE_LEN); //分配一个不存放有效数据的头结点
 
 //判空

 PNODE pTail = pHead;

 for(int i = 0; i < len; i++)
 {
  printf("请输入当前节点的值:");
  scanf("%f", &value);
  
  PNODE pNew = (PNODE)malloc(NODE_LEN);

  //判空
  
  pNew->value = value;
  pTail->next = pNew; //新构造的结点挂到
  pNew->next = NULL;
  pTail = pNew; //新构造的结点转化为尾巴结点
 }
 
 return pHead;
}

void traverse_list(PNODE pHead)
{
 PNODE p = pHead->next;

 while(NULL != p)
 {
  printf("%f \t", p->value);
  p = p->next;
 }
 printf("\n");
}

bool append_list(PNODE pHead, float value)
{
 PNODE p = pHead->next;
 while(NULL != p)
 {
  if(NULL == p->next)
  {
   break;
  }
  p = p->next; //此时p结点就是空节点
 }

 PNODE pNew = (PNODE)malloc(NODE_LEN);
 pNew->value = value;
 p->next = pNew;
 pNew->next = NULL;

 return true;

bool insert_list(PNODE pHead, int pos, float value)
{
 int count = 1; //计数器
 
 PNODE p = pHead->next;
 while(NULL != p)
 {
  count++;
  if(count == pos)
  {
   break;
  }
  p = p->next;
 }
 PNODE pNew = (PNODE)malloc(NODE_LEN);
 pNew->value = value;
 pNew->next = p->next;
 p->next = pNew;

 return true;
}      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值