前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构算法整理-02-单链表

数据结构算法整理-02-单链表

作者头像
devi
发布2021-08-18 15:39:47
2600
发布2021-08-18 15:39:47
举报
文章被收录于专栏:搬砖记录

1. 定义单链表

代码语言:javascript
复制
#include "stdio.h"   
#include "stdlib.h"  

typedef int datatype;
typedef struct node
{
  datatype data;
  struct node *next;
}linklist;

2. 创建一个空链表,返回指向链表的指针

代码语言:javascript
复制
/*创建一个空链表,返回指向链表的指针*/
linklist *creatList()
{	linklist *head;
	head = initList(head); 
	return head;
}

3. 初始化单链表

代码语言:javascript
复制
/*将单链表head置空*/
linklist* initList(linklist *head)
{
	head = (linklist*)malloc(sizeof(linklist));
	head->next = NULL;
	return head;
}

4. 尾插法创建单链表

代码语言:javascript
复制
/*创建一个非空链表(按尾插法创建),返回指向链表的指针*/
linklist *creatList1()
{	datatype x; int n;
	linklist *head,*rear,*p;
	head = initList(head);
	rear = head->next;
	printf("please input length of list:");
	scanf("%d",&n);
	printf("please input X to be insert:");
	while(n)
	{
		scanf("%d",&x);
		p = (linklist)malloc(sizeof(linklist));
		p->data=x;
		
		rear->next=p;
		rear = p;
		n--;
	}
	rear->next=NULL;
	return head;	
} 

5. 打印单链表

代码语言:javascript
复制
/*按从前向后的顺序显示链表中的元素值*/
void displaylist(linklist *head)
{
	linklist *p;

    p = head->next;   
    printf("\n单链表head的各个元素分别是 : ");   
    while(p) {   
        printf("%d -> ",p->data);   
        p=p->next;   
    } 
    printf("\n");  
}

6. 查找指定位置节点

代码语言:javascript
复制
void searchByIndex(linklist *head,int index)
{
	linklist p* =head->next;
	for(int i=0;i<index && p;i++)
		p = p->next;
	printf("%d",p->data);
}

7. 指定位置上插入结点

代码语言:javascript
复制
/*在某个位置上插入一个新结点*/ 
linklist* Insert(linklist *head,int i, datatype x)
{   linklist *p,*s; 
    int j;  
    p=head ;   
	j=0;    
    while (p && j<i-1)
    {
         p=p->next; 
         j++;
    }
    if (!p) printf("结点不存在!"); 
    else { 
        s=(linklist*)malloc(sizeof(linklist)) ;
        s->data=x;  
        s->next=p->next;       
        p->next=s;
    }
    return head;
}

8. 删除指定位置上的结点

代码语言:javascript
复制
/*删除某个位置上的结点*/ 
 
linklist * Delete(linklist *head,int i)
{  linklist *p,*q;  
   //datatype x;
   int j; 
   p=head ; j=0;  
   while (p && j<i-1)
   {
        p=p->next;
        j++;
   }
   if (!p||!p->next) 
        printf("结点不存在!"); 
   else {  
         q=p->next; 
         //x=q->data;   
         p->next=q->next;   
         free(q); 
	}
	return head;		
 }

9. 判断链表是否为空

代码语言:javascript
复制
/*判断链表head是否为空,为空返回1,否则返回0*/
int isEmpty(linklist *head)
{
	if(head->next) return 0;
	else return 1;
}

10. 按位置查找

代码语言:javascript
复制
/*查找第i个位置上的元素结点并返回*/ 
linklist* locateItem(linklist *head,int Index)
{
	linklist *p; int j;
	if(Index<=0) {printf("您要找的元素不存在!");return head;}
     p=head->next;  j=1;  
     while (p && j<Index)    
     {         
		 p=p->next; 
         j++;      
     }
     if (!p)   {printf("第i个元素不存在.\n");return NULL; }
     else return p;  
}

11. 删除单链表

代码语言:javascript
复制
/*删除链表,即删除所有结点*/
void deleteList(linklist *head)
{
	linklist *p,*q;
    p=head; 
    while (p)
  	{
        q=p;    
        p=p->next;  
        free( q);    
    }
	head = NULL;  
}

记忆小结

  1. 插入和删除都需要利用目标点的前一个节点,因此循环控制在j<i-1之前,因此循环控制条件还得保证p->next不为空(实际就是目标点不为空)
  2. 尾插法需要一个尾指针
  3. 删除单链表之后最后一步记得将head置空
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/12/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 定义单链表
  • 2. 创建一个空链表,返回指向链表的指针
  • 3. 初始化单链表
  • 4. 尾插法创建单链表
  • 5. 打印单链表
  • 6. 查找指定位置节点
  • 7. 指定位置上插入结点
  • 8. 删除指定位置上的结点
  • 9. 判断链表是否为空
  • 10. 按位置查找
  • 11. 删除单链表
  • 记忆小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档