数据结构学习1:链表的相关操作

step1:节点的描述

C语言中用带指针的结构体类型来描述:

typedef  struct  Lnode

{   ElemType  data;     /*数据域,保存结点的值 */

struct   Lnode  *next;      /*指针域*/

}LNode;        /*结点的类型 */

step2:节点的实现

动态分配   p=(LNode*)malloc(sizeof(LNode));

函数malloc分配了一个类型为LNode的结点变量的空间,并将其首地址放入指针变量p中。

动态释放  free(p) ;

系统回收由指针变量p所指向的内存区。P必须是最近一次调用malloc函数时的返回值。

step3:基本操作

⑴ 结点的赋值

LNode  *p;

p=(LNode*)malloc(sizeof(LNode));

p->data=20;  p->next=NULL ;

(2)增加一个元素

插入运算是将值为e的新结点插入到表的第i个结点的位置上,即插入到ai-1与ai之间。因此,必须首先找到ai-1所在的结点p,然后生成一个数据域为e的新结点q,q结点作为p的直接后继结点。

void  Insert_LNode(LNode *L,int i,ElemType e)

    /*  在以L为头结点的单链表的第i个位置插入值为e的结点 */

{   int  j=0;  LNode *p,*q;

p=L–>next ;

while  ( p!=NULL&& j<i-1)

{  p=p–>next;  j++;   }

if  (j!=i-1)     printf(“i太大或i为0!!\n ”);

else

{  q=(LNode *)malloc(sizeof(LNode));

q–>data=e;   q–>next=p–>next; //注意勾链顺序

p–>next=q;

}

}

(3)删除一个元素

按序号删除:

void  Delete_LinkList(LNode *L, int i)

  /*  删除以L为头结点的单链表中的第i个结点  */

{  int  j=1;  LNode *p,*q;

p=L;  q=L->next;

while  ( p->next!=NULL&& j<i)

{  p=q;  q=q–>next;  j++;  }

if  (j!=i)     printf(“i太大或i为0!!\n ”); 

else   

{  p–>next=q–>next;   free(q);    }

}

按值删除:

void  Delete_LinkList(LNode *L,int key)

/*  删除以L为头结点的单链表中值为key的第一个结点  */

{     LNode *p=L,  *q=L–>next;

while  ( q!=NULL&& q–>data!=key)    

{  p=q;  q=q–>next;   }

if  (q–>data==key)  

{  p->next=q->next;  free(q);   }

else 

printf(“所要删除的结点不存在!!\n”);

}

原文地址:https://www.cnblogs.com/zhaoxiaolei/p/2432678.html