数据结构学习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”);
}