链表各种操作总结

链表的相关函数操作

  1. 头文件
  2. 结构体的定义
  3. 函数声明
  4. 主函数
  5. 函数
  6. 链表与数组的优缺点
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
# include <stdbool.h>

typedef    struct Node 
{
	int date ;      //作为链表的数据域
	struct Node *pNext ;    //作为链表的指针域,用于指向结构体类行的下一个节点
} NODE  ,*PNODE ;          //  NODE 等价于 struat node  PNODE 等价于  struct  Node *

//对将要用到的函数进行声明
PNODE create_list (void);    //建立链表
void traverse_list (PNODE pHead);  //遍历链表
bool is_empty (PNODE pHead);      //判断链表是否为空
int length_list (PNODE pHead );   //求出链表的长度,将长度作为int 型数值返回
bool insert_list (PNODE ,int ,int );  //插入节点
bool delete_list (PNODE ,int ,int *);     //删除第int 个节点,并记录删除节点的数据
void soert_list (PNODE);                //节点排序




int  main (void )
{
	PNODE pHead =NULL;      //等价于   struct Node *pHead=NULL
	int val;                //用于记录删除节点的数据


	pHead =create_list (pHead);  //创建一个非循环的单链表,并将该链表的首给pHead
	traverse_list (pHead);

	int len =length_list (pHead);
	printf ("链表的长度是  %d \n",len );

	insert_list (pHead,4,33);
	traverse_list (pHead);

    
    soert_list (pHead);
    traverse_list (pHead);

	if (delete_list (pHead,4,&val))
	{
		printf ("删除成功,您删除的元素是: %d\n",val);
    }
    else 
    {
        printf ("删除失败!您删除的元素不存在。\n");
     }
     traverse_list (pHead);



     if (is_empty (pHead))
           printf ("链表为空!  \n");
     else 
          printf ("链表不为空!  \n");
     
     return 0;
}     
                   

创建链表函数

PNODE create_list (void)
{
   int len ;    //用于存放有效节点的个数
   int i;
   int val;      //用于临时存放用户输入的节点的值
   PNODE pHead =(PNODE )malloc (sizeof(NODE));      //分配了一个不存放有效数据的头节点
   if  (NULL==pHead)
   {
         printf (" 分配失败,程序终止  !\n");
         exit (-1);
    }  
    PNODE pTail=pHead;
    pTail->pNext =NULL; 
    printf ("请输入您需要生成的链表节点的个数  :len= ");
    scanf ("%d",&len);

    for (i=0;i<len;++i)
    {
        printf ("请输入第%d 个节点的值:",i+1);
        scanf ("%d",&val);
        
        PNODE pNew =(PNODE )malloc (sizeof (NODE));
        if (NULL==pNew)
        {
           printf ("分配失败,程序终止!\n");
           exit (-1);
        }
        pNew->date=val;
        pTail->pNext=pNew;
        pNew->pNext=NULL;
        pTail=pNew;
      }
      return pHead;   
}
   

22这里插入图片描述

链表的遍历

void traverse_list (PNODE pHead)
{
  PNODE p=pHead->pNext ;
  
  while (NULl!=p)
  {
     printf ("%d",p->date);
     p=p->pNext;
  }
  printf ("\n");

  return 0;
}  

判断链表是否为空

bool is_empty (PNODE pHead)
{
    if (pHead->pNext==NULL)
    return true;
    else 
    return false;
 }   

bool 是布尔型变量 头文件是 #include <stdbool.h>
BOOL是布尔型变量,也就是逻辑型变量的定义符,类似于float、double等,只不过float定义浮点型,double定义双精度浮点型。在objective-c中提供了相似的类型BOOL,它具有YES值和NO值。布尔型变量的值只有 真(true)和假(false),可用于逻辑表达式,也就是“或”“与”“非”之类的逻辑运算和大于小于之类的关系运算,逻辑表达式运算结果为真或为假。 (百科)
例如
bool b;
b=(1>2);
此时b=true。

求链表的长度

int length_list (PNODE pHead)
{
   PNODE p=pHead->pNext;
   int len =0;

   while (NULL!=p)
   {
       ++len ;
       p=p->pNext;
   }   
   return len;
}

使p指向节点的指针域,当所指向的指针域不为空时len +1,不包括首节点。

++i 和 i++的区别:
++ i 是先加后赋值;i ++ 是先赋值后加;++i和i++都是分两步完成的

链表的排序

void soert_list (PNODE pHead)
{
   int i,j,t;
   int len =length_list (pHead);
   PNODE p,q;
   for (i=0,p=pHead->pNext;i<len-1;i++,p->pNext)
   {
      for (j=i+1,q=p->pNext;j<len-1;++j,q=q->pNext)
      {
          if (p->date>q->date)     //类似于数组中的 a[i]>a[j]
          {
             t=p->date;     //类似于数组中的  t=a[i]
             p->date=q->date;    //类似于数组中的a[i]=a[j]
             q->date=t;          //类似于数组中的  a[j]=t;
           }
       }
    }
             
        return ;
}                      



泛型的定义:
利用某种技术达到的效果(使不同存储方式执行的操作相同)

新链表的插入

//在pHead所向链表的第pos 个节点的前面插入一个新的节点,该节点的值是val,并且pos 的值是从1开始
bool insert_list (PNODE pHead,int pos,int val)
{
  int i=0;
  PNODE p=pHead;
   
   while (NULL!=p&&i<pos-1)
   {
      p=p->pNext;
      ++i;
   }
   if (i>pos-1||NULL==p)
   return false;
   
   PNODE pNew = (PNODE)malloc (sizeof(NODE ));
   if (NULL==pNew)
   {
      printf ("动态分配内存失败! \n");
      exit (-1);
    }
    pNew->date=val;
    PNODE q=p->pNext;
    p->pNext=pNew;
    pNew->pNext=q;


    return true ;
 }     
     

链表的删除

bool delete_list (PNODE pHead,int pos,int *pVal)
{
   int i=0;
   PNODE p=pHead;

   while (NULL!=p->pNext&&i<pos-1)
   {
     p=p->pNext;
     ++i;
   }
 
   if (i>pos-1||NULL==p->pNext)
   return false;

    PNODE q=p->pNext;
    *pVal=q->date ;

    // 删除p 节点后面的节点
    p->pNext=p->pNext->pNext;
    free (q);
    q=NULL;
    return   true;
} 
    

6
数据的存储结构分为线性和非线性
线性分为连续存储( 数组)和离散存储 (链表) 应用为栈和队列
数组 :
存储速度快,但插入元素很慢空间通常有限制
链表 :
空间无限制,插入删除元素很快 但是存取的速度慢

非线性的为

发布了4 篇原创文章 · 获赞 1 · 访问量 141

猜你喜欢

转载自blog.csdn.net/taco_tuesday/article/details/104174087