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

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

问题描述

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

单链表的基本运算如下:

(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("\n\n");
}

代码实现

#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("\n");
	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("\n\n");
}
int main()
{
	//使用cnt来记录元素个数 
	int cnt=0, a[10], i, e, tmp;	
	LinkList head;
	if(!init(head))
	{
		printf("初始化链表失败,程序退出\n");
		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("链表为空,没有输出\n");
	
	printf("链表的长度为%d个\n", list_size(head));
	printf("%s", isempty(head)? "链表为空":"链表非空");
	if(getdata(head, 3, e))
		printf("链表中的第三个元素是%d\n", e);
	else 
		printf("获取链表中的元素出现错误\n");
	if(find(head, a[0], e))
		printf("%d在链表中的位置是%d\n", a[0], e);
	else 
		printf("%d不在链表中\n", a[0]);
	printf("输入要在第四个位置上插入的元素:");
	scanf("%d", &tmp);
	if(listinsert(head, 4, tmp))
		printf("插入成功\n");
	else 	
		printf("插入失败\n");
	if(!display(head))
		printf("链表为空,没有输出\n");
	if(del(head, 3, e))
		printf("删除第三个元素成功\n");
	else 
		printf("删除第三个元素失败\n");	 
	if(!display(head))
		printf("链表为空,没有输出\n");
	if(clear(head))
		printf("free成功\n");
	else printf("free失败\n");
	return 0;
}
posted @ 2019-11-05 09:24  ALKING1001  阅读(207)  评论(0编辑  收藏  举报