带头结点的单链表/删查

单链表存储结构
typedef struct LNode{
	 ElemType data;
	 struct LNode *next;//存放下一个链表的地址
}LNode,*LinkList;
插入数据
void InsertSLinklist(LinkList &L,int Location,ElemType elem){
 //先创建一个数据域为elem的节点
 LinkList Insert = (LinkList)malloc(sizeof(LNode));
 Insert->data = elem;
 //找到Location前面的那个节点。因为要更改它的指针域
 LinkList p = L;
 int j = 0;
 while (p&&j < Location - 1) //当单链表没有找完,且j<Location-1.
  //因为当J=location-1时,就已经找到了
 {
	  p = p->next;
	  j++;
 }
 //找完以后的p就是要插入位置的前面的节点
 Insert->next = p->next;
 p->next = Insert;
}
删除某个节点
void DeleteSLinklist(LinkList &L,int Location,int &elem) {
  //先找到Location-1处的节点
	int j = 0;
        LinkList p;
	p = L;
 while (p&&j < Location-1) {
	p = p->next;
	j++;
 }//结束后p为location-1处的节点
	 LinkList q;
	 q = p->next;
	 p->next = q->next;//直接让location的前驱的指针域指向location的后继
     elem = q->data;
     free(q);
  }
刚开始我的指针传递的过程是这么写的
printf("%d", p->next->data);//4
 elem = p->next->data;
  p->next=p->next->next;
  printf("%d", p->next->data);//3
  设置一个新的变量取接收Location位置的原地址,方便free
    free(p->next);

这样虽然指针传递没错,但是这样不利于free之前的内存。内存不被free会有其他的影响。所以便于free的话,使用变量,记录当前需要free的值。最后free就ok!

打印单链表
void ShowSLinklist(LinkList L) {
 LinkList p;
 p = L->next;
 if (L ->next == NULL)
 {
  printf("链表为空\n");
 }
 else {
  printf("该单链表的数据如下:\n");
  while (p) {
   printf("%d\t", p->data);
   p = p->next;
  }
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值