• C语言单链表操作


    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    
    typedef int ElemType;
    typedef struct Lnode {
    	ElemType data;
    	struct Lnode* next;
    }LNode, * LinkList;
    
    /*
    	单链表的初始化
    */
    void InitList_L(LinkList& L) {
    	L = (LinkList)malloc(sizeof(LNode));
    	if (!L)exit(-1);
    	L->next = NULL;
    }
    
    /*
    	判断链表是否为空
    */
    bool ListEmpty(LinkList L) {
    	if (L->next)
    	{
    		return true;
    	}
    	else {
    		return false;
    	}
    }
    
    /*
    	销毁单链表
    	包括头节点内存空间全部释放
    */
    int DestroyList_L(LinkList& L) {
    	LinkList p;
    	//依次释放所有结点
    	while (L) {
    		p = L;
    		L = L->next;
    		free(p);		
    	}
    	return 1;
    }
    
    /*
    	清空单链表
    	释放除头节点之外所有节点的内存空间
    */
    int ClearList_L(LinkList& L) {
    	LinkList p, q;
    	p = L->next;
    	while (p)
    	{
    		q = p->next;
    		free(p);
    		p = q;
    
    	}
    	L->next = NULL;
    	return 1;
    }
    
    /*
    	求单链表的表长
    */
    int ListLength(LinkList L) {
    	int i = 0;
    	LinkList p = L->next;
    	while (p) {
    		i++;
    		p = p->next;
    	}
    	return i;
    }
    
    /*
    	取值---取单链表中第i个元素的内容返回第i个元素地址
    */
    LinkList GetElem_L(LinkList L, int i) {
    	int j = 1;
    	LinkList p;
    	p = L->next;
    	if (i == 0)  //若i=0返回头结点
    	{
    		return L;
    	}
    	if (i < 1)
    	{
    		return NULL;//若i无效返回NULL
    	}
    	while (p && j < i)//从第一个结点开始查找,查找第i个结点
    	{
    		p = p->next;
    		j++;
    	}
    	return p;
    }
    
    /*
    	按值查找---根据指定数据获取数据所在位置(地址)
    */
    LinkList LocateElem_L(LinkList L, ElemType e) {
    	LinkList p;
    	p = L->next;
    	while (p && p->data != e)
    	{
    		p = p->next;
    	}
    	return p;
    }
    
    /*
    	查找:按值查找:根据指定数据获取数据所在位置(序号)
    */
    int LocateElem_L2(LinkList L, ElemType e) {
    	int j = 1;
    	LinkList p = L->next;
    	while (p && p->data != e)
    	{
    		p = p->next;
    		j++;
    	}
    	if (p)
    	{
    		return j;
    	}
    	else
    	{
    		return 0;
    	}
    }
    
    /*
    	插入:在第i个结点前插入新结点
    */
    int ListInsert_L(LinkList& L, int i, ElemType e) {
    	//查找第i - 1个结点的地址
    	LinkList p = GetElem_L(L, i - 1);
    	LinkList s = (LinkList)malloc(sizeof(LNode));
    	if (!s)exit(-1);
    	s->data = e;
    	s->next = p->next;
    	p->next = s;
    	return 1;
    }
    
    /*
    	删除第i个结点
    */
    int ListDelete_L(LinkList& L, int i, ElemType& e) {
    	//查找要删除结点的前一个结点
    	LinkList p =  GetElem_L(L, i - 1);
    	LinkList q = p->next;
    	e = q->data;
    	p->next = q->next;
    	free(q);
    	return 1;
    }
    
    /*
    	单链表的建立:头插法
    */
    int CreateList_H(LinkList& L) {
    	printf("输入要插入的数据(输入9999结束运行):
    ");
    	int val;
    	scanf_s("%d", &val);
    	while (val != 9999)
    	{
    		LinkList p = (LinkList)malloc(sizeof(LNode));
    		if (!p)exit(-1);
    		p->data = val;
    		p->next = L->next;
    		L->next = p;
    		printf("输入要插入的数据(输入9999结束运行):
    ");
    		scanf_s("%d", &val);
    	}
    	return 1;
    }
    
    /*
    	单链表的建立:尾插法
    */
    int CreateList_R(LinkList& L) {
    	printf("输入要插入的数据(输入9999结束运行):
    ");
    	int val;
    	LinkList r = L;
    	LinkList p;
    	scanf_s("%d", &val);
    	while (val != 9999)
    	{
    		p = (LinkList)malloc(sizeof(LNode));
    		if (!p)exit(-1);
    		p->data = val;
    		p->next = NULL;
    		r->next = p;
    		r = p;
    		printf("输入要插入的数据(输入9999结束运行):
    ");
    		scanf_s("%d", &val);
    	}
    	return 1;
    }
    
    /*
    	遍历单链表
    */
    void List_traverse(LinkList L) {
    	LinkList p = L->next;
    	while (p)
    	{
    		printf("%d ", p->data);
    		p = p->next;
    	}
    }
    int main() {
    	LinkList L;
    	ElemType e;
    	InitList_L(L);
    	//CreateList_H(L);//头插法
    	CreateList_R(L);//尾插法
    	//ClearList_L(L);//清空单链表
    	//printf("%d", ListLength(L));//求单链表的表长
    	//printf("%d", LocateElem_L2(L, 3));//查找:按值查找:根据指定数据获取数据所在位置(序号)
    	//ListInsert_L(L, 3, 111);//插入:在第i个结点前插入新结点
    	ListDelete_L(L, 3, e);//删除第i个结点
    	List_traverse(L);
    	return 0;
    }
    
    我亦无他,惟手熟尔
  • 相关阅读:
    切割栅格数据 切割raster
    缓存讲解
    Arcengine动态发布WMS
    dos命令
    在遥感影像中,立体相对观测的原理是什么?
    Top 10 steps to optimize data access in SQL Server: Part V (Optimize database files and apply partitioning)
    http://blog.csdn.net/itanders
    How to receive Deadlock information automatically via email
    减负
    Provisioning a New SQL Server Instance Series
  • 原文地址:https://www.cnblogs.com/AsuraPlus/p/15413056.html
Copyright © 2020-2023  润新知