实现链表的基本操作 数据结构
实现链表的基本操作 数据结构
问题描述
【实现单链表各种基本运算的算法】该算法的设计,要求运行结果如下所示:这里的元素使用数字代替,数字的生成使用随机函数来实现)
单链表的基本运算如下:
(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;
}
欢迎评论交流!