• C语言 链表


    C语言 链表

    **结点:**每个空间采用动态数据分配,,每个数据空间保存一个数据,可以根据需求分配数据空间数,而每个数据空间就叫做一个结点。每个结点结构中,我们定义一个成员存放下一个结点的首地址,用于存放下一个结点的成员,这个称为指针域
    **链表:**第一个结点的指针域存放下一个结点的首地址,以此内推一直到最后一个结点,最后一个结点的指针域指向Null。

     

    链表的简单示意图

    链表示意图

     

    第0个结点称为头结点,没有数据只存放第一结点的首地址
    每个结点的都是同一种数据结构

    struct Node{
    	int data;
    	struct student *next;
    }Node,*PNode;
    

    链表的基本操作:

    • 链表的创建
    • 链表的判断
    • 链表的长度获取
    • 链表的插入
    • 链表的删除
    • 链表的遍历
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<sys/stat.h>
    #include<stdbool.h>
    
    #define LEN sizeof(struct Node)
    
    typedef struct Node{
    	int data;
    	struct Node *pnext;
    }Node, *PNode;
    
    /*创建链表:pHead为头结点,pTail为尾结点,pNew为新创建的结点*/
    PNode creatList(void){
    	PNode pHead, pTail, pNew;
    	int n, i;
    	pHead = (PNode)malloc(LEN);
    	pHead->pnext = NULL;
    	pTail = pHead;
    	printf("请输入链表的长度
    ");
    	scanf("%d",&n);
    	for(i = 0; i < n; i++){
    		pNew = (PNode)malloc(LEN);
    		pNew->pnext = NULL;
    		printf("请输入第%d个链表的值
    ", i+1);
    		scanf("%d", &pNew->data);
    		pTail->pnext = pNew;
    		pTail = pNew;		
    	}
    	return pHead;
    }
    
    /*链表的判断:判断链表是不是为空*/
    bool isempty(PNode pHead){
    	if(pHead->pnext == NULL)
    		return true;
    	else return false;
    }
    
    /*链表的长度:获取链表的长度*/
    int list_num(PNode pHead){
    	int num = 0;
    	PNode p;
    	p = pHead->pnext;
    	while(p != NULL){
    		num+=1;
    		p = p->pnext;
    	}
    	return num;
    }
    
    /*链表的遍历:输出链表所有的数据*/
    void traversal(PNode pHead){
    	PNode p;
    	p = pHead->pnext;
    	while(p != NULL){
    		printf("%d
    ", p->data);
    		p = p->pnext;
    	}
    }
    
    /*链表的插入:插入的位置和数据需要提供*/
    bool insert(PNode pHead, int val, int pos){
    	PNode p, pNew;
    	int i = 1;
    	p = pHead->pnext;
    	while(p != NULL){
    		if(i == pos){
    			pNew = (PNode)malloc(sizeof(LEN));
    			pNew->data = val;
    			pNew->pnext = p->pnext;
    			p->pnext = pNew;
    			printf("插入成功
    ");
    			return true;
    		}
    		p = p->pnext;
    		i++;
    	}
    	printf("插入位置超过链表实际大小
    ");
    	return false;
    }
    
    /*链表的删除:*/
    bool delete(PNode pHead, int pos){
    	int i;
    	PNode p, tmp;
    	p = pHead;
    	for(i=1; p!=NULL && i < pos; i++)
    		p = p->pnext;
    	if(p == NULL){
    		printf("删除错误
    ");
    		return false;
    	}
    	tmp = p;
    	p = p->pnext;
    	tmp->pnext = p->pnext;
    	free(p);
    	return true;
    }
    
    int main(int argc, char const *argv[])
    {
    	PNode pHead;
    	pHead = creatList();
    	if(isempty(pHead))
    		printf("链表为空
    ");
    	printf("链表的长度为:%d
    ",list_num(pHead));
    	traversal(pHead);
    	//insert(pHead,55,1);
     	delete(pHead,2);
    	traversal(pHead);
    	return 0;
    }
    
  • 相关阅读:
    10种 分布式ID生成方式(新增MongoDB的ObjectId)
    Spring核心接口Ordered的实现及应用 (动态切换数据源时候用到)
    No module named 'Crypto' 解决方案
    使用Anaconda管理多个版本的Python环境
    深入浅出Blazor webassembly 之API服务端保护
    [转载]HTTPS 是如何保护你的安全的
    [转载]api接口token的生成和应用
    深入浅出Blazor webassembly之HttpClient使用
    深入浅出Blazor webassembly之自定义Input组件
    深入浅出Blazor webassembly之EditForm
  • 原文地址:https://www.cnblogs.com/yujianfei/p/8973844.html
Copyright © 2020-2023  润新知