zoukankan      html  css  js  c++  java
  • 实现链表的基本操作 数据结构

    实现链表的基本操作 数据结构

    问题描述

    【实现单链表各种基本运算的算法】该算法的设计,要求运行结果如下所示:这里的元素使用数字代替,数字的生成使用随机函数来实现)

    单链表的基本运算如下:

    (1)初始化单链表head

    (2)依次采用尾插法插入a,b,c,d,e元素

    (3)输出单链表head:a b c d e

    (4)单链表head长度:5

    (5)单链表head为非空

    (6)单链表head的第3个元素:c

    (7)元素a的位置:1

    (8)在第4个元素位置上插入f元素

    (9)输出单链表head:a b c f d e

    (10)删除head的第3个元素

    (11)输出单链表head:a b f d e

    (12)释放单链表head

    /*
    	产生n个[min, max]的随机数。可能会有重复值。
    */
    void initRandomize(int *arr, int n, int min, int max)
    {
        int i = 0;
        srand(time(0));  			/*设置种子,并生成伪随机序列*/
        for (i = 0; i < n; ++i) {
            arr[i] = rand() % (max - min + 1) + min;  /*得到从[min, max]之间的随机数*/
            printf("%d ", arr[i]);
        }
        printf("
    
    ");
    }
    

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    typedef struct LNode
    {
    	int data;
    	struct LNode *next;
    }LNode, *LinkList;
    bool init(LinkList &L) //初始化,采用带有头结点的链表形式
    {
    	L=(LinkList)malloc(sizeof(LNode));
    	if(L==NULL)
    		return false;
    	L->next=NULL;
    	return true; 
    }
    bool creat_list(LinkList &L, int a[], int n) //采用尾插法建立单链表 
    {
    	LinkList p=L, s;
    	for(int i=0; i<n; i++)
    	{
    		s=(LinkList)malloc(sizeof(LNode));
    		if(s==NULL)
    			return false;
    		s->data=a[i];
    		s->next=NULL;
    		p->next=s;
    		p=s;
    	}
    	return true;
    }
    bool listinsert(LinkList &L, int i, int e)
    {
    	LinkList p=L, s;
    	int j=0;
    	if(i<1)
    		return false;
    	while(p && j<i-1)
    	{
    		p=p->next;
    		j++;
    	}
    	if(p==NULL)
    		return false;
    	s=(LinkList)malloc(sizeof(LNode));
    	s->data=e;
    	s->next=p->next;
    	p->next=s; 
    	return true;
    }
    bool del(LinkList &L, int i, int &e)
    {
    	LinkList p=L, s;
    	int j=0;
    	if(i<1)
    		return false;
    	while(p && j<i-1)
    	{
    		p=p->next;
    		j++;
    	}
    	if(p==NULL)
    		return false;
    	s=p->next;
    	p->next=s->next;
    	free(s);
    	return true;
    }
    bool getdata(LinkList &L, int i, int &e) //得到第i个元素 
    {
    	LinkList p=L->next;
    	int j=1;
    	if(i<1 || p==NULL)
    		return false;
    	while(p && j<i)
    	{
    		p=p->next;
    		j++;
    	}
    	if(p==NULL)
    		return false;
    	e=p->data;
    	return true;
    }
    bool find(LinkList &L, int x, int &e)
    {
    	LinkList p=L->next;
    	int j=1;
    	if(p==NULL)
    		return false;
    	while(p)
    	{
    		if(p->data==x)
    		{
    			e=j;
    			return true;
    		}
    		p=p->next;
    		j++;
    	}
    	return false;
    }
    bool display(LinkList &L)
    {
    	LinkList p=L->next;
    	if(p==NULL)
    		return false;
    	while(p)
    	{
    		printf("%d ", p->data);
    		p=p->next;
    	}
    	printf("
    ");
    	return true;
    }
    int list_size(LinkList L)
    {
    	int j=0;
    	LinkList p=L->next;
    	while(p)
    	{
    		j++;
    		p=p->next;
    	}
    	return j;
    }
    bool isempty(LinkList L)
    {
    	L=L->next;
    	if(L==NULL)
    		return true;
    	else return false;
    }
    bool clear(LinkList &L)
    {
    	LinkList p;
    	while(L)
    	{
    		p=L->next;
    		free(L);
    		L=p;
    	} 
    	L=NULL;
    	return true;
    }
    void initRandomize(int *arr, int n, int min, int max)
    {
        int i = 0;
        srand(time(0));  			/*设置种子,并生成伪随机序列*/
        for (i = 0; i < n; ++i) {
            arr[i] = rand() % (max - min + 1) + min;  /*得到从[min, max]之间的随机数*/
            printf("%d ", arr[i]);
        }
        printf("
    
    ");
    }
    int main()
    {
    	//使用cnt来记录元素个数 
    	int cnt=0, a[10], i, e, tmp;	
    	LinkList head;
    	if(!init(head))
    	{
    		printf("初始化链表失败,程序退出
    ");
    		return 0;
    	}
    	initRandomize(a, 5, 0, 10);
    	/*
    	for(i=0; i<5; i++) //这里采用普通的插入法来进行创建链表 
    	{
    		listinsert(head, i+1, a[i]);
    	}
    	*/
    	creat_list(head, a, 5);//使用尾插法来创建链表 
    	if(!display(head))
    		printf("链表为空,没有输出
    ");
    	
    	printf("链表的长度为%d个
    ", list_size(head));
    	printf("%s", isempty(head)? "链表为空":"链表非空");
    	if(getdata(head, 3, e))
    		printf("链表中的第三个元素是%d
    ", e);
    	else 
    		printf("获取链表中的元素出现错误
    ");
    	if(find(head, a[0], e))
    		printf("%d在链表中的位置是%d
    ", a[0], e);
    	else 
    		printf("%d不在链表中
    ", a[0]);
    	printf("输入要在第四个位置上插入的元素:");
    	scanf("%d", &tmp);
    	if(listinsert(head, 4, tmp))
    		printf("插入成功
    ");
    	else 	
    		printf("插入失败
    ");
    	if(!display(head))
    		printf("链表为空,没有输出
    ");
    	if(del(head, 3, e))
    		printf("删除第三个元素成功
    ");
    	else 
    		printf("删除第三个元素失败
    ");	 
    	if(!display(head))
    		printf("链表为空,没有输出
    ");
    	if(clear(head))
    		printf("free成功
    ");
    	else printf("free失败
    ");
    	return 0;
    }
    
    欢迎评论交流!
  • 相关阅读:
    c#基于业务对象的筛选
    SQLServer索引调优实践
    C#中抽象类和接口的区别
    c#基础(2) 理解委托和事件
    建议学习jQuery的步骤!
    SQL SERVER存储过程调用存储过程并接收输出参数或返回值的方法
    ASP.NET基于JQUERY的高性能的TreeView
    GetManifestResourceStream得到的Stream是null的解决
    Using GDI+ on Windows Mobile 初体验
    提供一个Windows mobile Native UI 程序,循序渐进开发,并附有代码!
  • 原文地址:https://www.cnblogs.com/alking1001/p/11796439.html
Copyright © 2011-2022 走看看