线性表的链式存储结构的实现
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;
}