线性表及其实现—链式存储(链表篇)

线性表的链式存储实现

不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建立起数据元素之间的逻辑关系。

• 插入、删除不需要移动数据元素,只需要修改“链”。

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;
 }
  1. 删除(删除链表的第 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;
    }
	   }
	} 
 } 
posted @ 2021-07-26 10:24  日月既往、不复可追。  阅读(261)  评论(0编辑  收藏  举报
Fork me on GitHub /*音乐*/ 1 2 3
4