线性表及其实现—链式存储(链表篇)
作者:互联网
线性表的链式存储实现
不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建立起数据元素之间的逻辑关系。
• 插入、删除不需要移动数据元素,只需要修改“链”。
typedef struct lnode *list; //取别名 struct lnode *结构体指针等价于list
struct lnode{ //创建结构体
int data; ///存储数据部分
list next; //存储下一个结点
};
struct lnode l; //定义一个结构体 l
list ptrL; //定义一个结构体指针变量
主要操作的实现
1、求链表长度
int length(list ptrl) //形参 链表的头结点
{
list p=ptrl; /* p指向表的第一个结点*/
int j=0;
while (p){
p=p->next; //指针向后移动,遍历整个链表
j++ //遍历链表的同时记录链表长度
}
return j;
}
2.1按序号查找
list findkth(int k;list ptrl)
{ list p=ptrl; //将头节点的地址赋给p
int i=1;
while(p!=NULL&&i<k){
p=p->next;
i++;
}
if(i==k)return p; /* 找到第K个,返回指针 */
else return NULL; /* 否则返回,返回空 */
}
2.2按值查找 :
list find(int x;list ptrl)
{
list p=ptrl;
while (p!=null&&p->data!=x)
p=p->next;
return p;
}
3.插入操作的实现(在第 i-1(1≤i≤n+1)个结点后插入一个值为X的新结点)
/(1)先构造一个新结点,用s指向;
(2)再找到链表的第 i-1个结点(即要插入位置的前一个结点),用p指向;
(3)然后修改指针,插入结点 ( p之后插入新结点是 s/
list insert( int x, int i, list ptrL )
{ list p, s;
if ( i == 1 ) { /* 新结点插入在表头 */
s = (list)malloc(sizeof(struct lnode)); /*申请、填装结点*/
s->data = x;
s->next = ptrL;
return s; /*返回新表头指针*/
}
p = findkth( i-1, ptrL ); /* 查找第i-1个结点 通过 findkth函数查找 返回 其地址
if ( p == NULL ) { /* 第i-1个不存在,不能插入 */
printf("参数i错");
return NULL;
}else {
s = (list)malloc(sizeof(struct lnode)); /*申请、填装结点*/
s->data = x;
s->next = p->next; /*新结点插入在第i-1个结点的后面*/
p->next = s;
return ptrL;
}
- 删除(删除链表的第 i (1≤i≤n)个位置上的结点)
//(1)先找到链表的第 i-1个结点,用p指向;
//(2)再用指针s指向要被删除的结点(p的下一个结点);
//(3)然后修改指针,删除s所指结点;
//(4)最后释放s所指结点的空间。
list delete( int i,list ptrl)//传入 要删除节点的序号,和链表的头结点
{
list p,s;
if(i==1)
{//如果要删除的结点就是头结点
s=ptrl;
if(ptrl!=NULL)ptrl=ptrl->next;
else return NULL;
free(s);
return ptrl;
}
p=findkth(i-1,ptrl); /*查找第i-1个结点*/
if ( p == NULL )
{
printf(“第%d个结点不存在”, i-1); return NULL;
}
else if ( p->next == NULL )
{
printf(“第%d个结点不存在”, i); return NULL;
}
else
{
s = p->next; /*s指向第i个结点*/
p->next = s->next; /*从链表中删除*/
free(s); /*释放被删除结点 */
return ptrL;
}
}
}
}
标签:结点,return,线性表,list,next,链表,ptrl,链式 来源: https://www.cnblogs.com/ZYL212003180/p/15048243.html