线性表的链式存储结构

线性表的链式存储结构的实现

1)编写完成下列功能的函数:( 1)初始化一个线性表;(2)在已经初始化的基础上,创建一个包含 15 个不大于 100 的正整数值的线性表(15 个值由计算机随机产生);(3)将一个数 x 插在第 i 个元素前(x 和 i 在程序运行时输入);( 4)删除第 i 个元素(i 在程序运行时输入),并在删除结束后输出删除元素的值;(5)查找给定值 x 是否在线性表中(x 在程序运行时输入),若在,输出 x 在线性表中第一次出现的位置,若不在就输出 x 不在表中的提示;(6)输出线性表中所有元素。

线性表的链式存储结构定义

typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;

C语言版,但会使用C++中的一个符号&,建议用C++文件。
在 C 的头文件 stdlib.h 中有 srand( )接受随机数的种子和 rand( )产生 0~RAND_MAX 的一个随机整数的函数。用 rand( )%100+1 可以产生不大于 100 的正整数值。

 #include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define OK 1
#define ERROR 0
typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode,*LinkList;

int InitList(LinkList &L);
void CreateList(LinkList &L,int n);
int ListInsert(LinkList &L,int i,int x);
int ListDelete(LinkList &L,int i);
LinkList LocateElem(LinkList L,int x);
void PrintList(LinkList L);

int InitList(LinkList &L)
{//初始化
	 L = (LinkList)malloc(sizeof(LNode));//申请了一个带头结点的空指针
	 if(!L)
		 return ERROR;
	 L->next = NULL;
	 return OK;
}

void CreateList(LinkList &L,int i)
{//建立
	 LinkList q = L;
	 srand((unsigned)time(NULL));
	 for(int j = 0;j < i;j++ )
	 {
		 LinkList p = (LinkList)malloc(sizeof(LNode));//申请一个新节点p
		 p->data = rand() % 100 +1;
		 q->next = p;//将每一个新申请的p插在q的后面
		 q = p;//q后移
	 }
	 q->next = NULL;
}
int ListInsert(LinkList &L,int i,int x)
{//插入
	LinkList p = L;
	int j = 0;
	while(p && j < i-1)//找合法i的位置,记下i的前驱
	{
		p = p->next;
		j++;
	}
	//插入有(长度+1)个位置
	if(!p || j > i-1)//找完了也没找到i位置(i的位置太大)和i的位置太小
		return ERROR;
	LinkList s = (LinkList)malloc(sizeof(LNode));
	s->data = x;
	s->next = p->next;
	p->next = s;
	return OK;
}
int ListDelete(LinkList &L,int i)
{//删除
	LinkList p = L;
	int j = 0;
	while(p->next && j < i-1)//找合法i的位置,记下i的前驱
	{
		p = p->next;
		j++;
	}
	//删除有(长度)个位置
	if(!(p->next) || j > i-1)//找完了也没找到i位置(i的位置太大)和i的位置太小
		return ERROR;
	LinkList q = p->next;//记下i位置,便于释放
	p->next = q->next;
	free(q);//释放
	return OK;
}
LinkList LocateElem(LinkList L,int x)
{//查找
	LinkList p = L->next;
	int i = 1;
	while(p && p->data != x)
	{	
		p = p->next;
		i++;
	}
	if(!p)
		printf("未找到该数");
	else
		printf("该数第一次出现在第%d个",i);
	return p;
}
void PrintList(LinkList L)
{//遍历
	LinkList p = L->next ;
	while(p != NULL)
	{
		printf("%d ",p->data );
		p = p->next ;
	}
}
int main()
{
	for(int k = 0;;k++)
	{
        int a,i2,i3,x3,i4,x5,h;
		LinkList L;
		printf("\n1.初始化一个链表\n");
		printf("2.创建一个正整数的链表\n");
		printf("3.插入某个元素\n");
		printf("4.删除某个元素\n");
		printf("5.查找元素\n");
		printf("6.遍历元素\n");
		printf("7.退出程序\n");
		printf("输入你的选择:\n");
		scanf("%d",&a);
		switch (a)
		{
		    case 1:
				h = InitList(L);
				if(h == 1)
					printf("初始化成功!");break;
			case 2:
				printf("该链表长度为:");
				scanf("%d",&i2);
				CreateList(L,i2);
				PrintList(L);break;
			case 3:
				printf("你想插入的位置为:");
				scanf("%d",&i3);
				printf("你想插入的数为:");
				scanf("%d",&x3);
				ListInsert(L,i3,x3);
				PrintList(L);break;
			case 4:
				printf("你想删除的位置为:");
				scanf("%d",&i4);
				ListDelete(L,i4);
				PrintList(L);break;
			case 5:
				printf("你想查找的数为:");
				scanf("%d",&x5);
				LocateElem(L,x5);break;
			case 6:PrintList(L);break;
			case 7:exit(0);
		}
	}
	return OK;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值