c数据结构 顺序表和链表 相关操作

编译器:vs2013

内容:

#include "stdafx.h"
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

#define LINK_INIT_SIZE 100
#define LISTINCREAMENT 10
#define ElemType int
#define OVERFLOW -2
#define OK 1
#define ERROR 0

typedef int status;

//定义顺序表,并定义一个新类型Sqlist
typedef struct Sqlist{
ElemType *elem;
int listsize;
int length;
}Sqlist;

//函数声明
status InitList(Sqlist &L);
status CreatList(Sqlist &L);
status PrintfList1(Sqlist L);
status PrintfList2(Sqlist L);
status DeleteList(Sqlist &L, int i);
status ListEmpty(Sqlist L);
status ListLength(Sqlist L);
status InsertList(Sqlist &L, int i, ElemType e);
status DestroyList(Sqlist &L);

int main()
{
int i,n,j ;
ElemType e;
Sqlist L1;
InitList(L1); //顺序表初始化操作

ListEmpty(L1); //顺序表判空

CreatList(L1); //顺序表赋值操作

printf("正序输出为:\n");
PrintfList1(L1); //顺序表正序输出操作
printf("\n");
printf("逆序输出为:\n");
PrintfList2(L1); //顺序表逆序输出操作
printf("\n");

ListLength(L1); //求顺序表表长

printf("请输入插入的位置i=");
scanf_s("%d", &i);
e=rand() % 100 + 1;
InsertList(L1, i, e); //顺序表插入操作
PrintfList1(L1);
printf("\n");

printf("请输入删除的位置j=");
scanf_s("%d", &j);
DeleteList(L1,j); //顺序表删除操作
PrintfList1(L1);

DestroyList(L1); //顺序表销毁操作
PrintfList1(L1);
return 0;
}

//构建空的顺序表
status InitList(Sqlist &L)
{
L.elem = (ElemType*)malloc(LINK_INIT_SIZE*sizeof(ElemType));
if (!L.elem)
exit (OVERFLOW);
L.length = 0; //将新的顺序表长度定为0
L.listsize = LINK_INIT_SIZE; //初始化顺序表大小为LINK_INIT_SIZE
return OK;
}

//顺序表插入操作
status InsertList(Sqlist &L, int i, ElemType e)
{
ElemType *newbase, *q,*p;
if (i<1 || i>L.length + 1)
{
printf("未插入成功!!!\n");
return ERROR;
}
if (L.length >= L.listsize)
{
newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREAMENT)*sizeof(ElemType));
if (!newbase)
exit(OVERFLOW);
L.elem = newbase;
L.listsize += LISTINCREAMENT;
} //检验线性表是否满了,满了则重新增加存储空间
q = &(L.elem[i - 1]);
for (p = &(L.elem[L.length - 1]); p >= q; p--)
*(p + 1) = *p;
*q = e;
L.length++;
return OK;
}

//顺序表输入操作
status CreatList(Sqlist &L)
{
ElemType i=0,e;
for (i = 0; i < 10; i++) //顺序表赋值操作
{
L.elem[i] = rand() % 100 + 1;
L.length++;
}
return 0;
}

//顺序表正序输出操作
status PrintfList1(Sqlist L)
{
int i;
if (L.length == 0)
{
printf("该线性表为空!\n");
return 0;
}
for (i = 0; i < L.length; i++)
printf("L.elem[%d]=%d\n", i + 1, *(L.elem + i));
}

//顺序表删除操作
status DeleteList(Sqlist &L, int i)
{
int *p, *q,e;
if (i<1 || i>L.length + 1)
{
printf("不存在此删除位置!!!\n");
return ERROR;
} //检验输入的i是否在线性表所存在的范围内
p = &(L.elem[i - 1]);
e = *p;
q = L.elem + L.length - 1;
for (p++; p <= q; ++p)
*(p - 1) = *p;
L.length--;
printf("删除的元素为%d\n", e);
return 0;
}

//顺序表逆序输出操作
status PrintfList2(Sqlist L)
{
int i;
if (L.length == 0)
{
printf("该线性表为空!\n");
return 0;
}
for (i = L.length-1; i >=0; i--)
printf("L.elem[%d]=%d\n", i + 1, *(L.elem + i));
}

//求顺序表是否为空
status ListEmpty(Sqlist L)
{
if (L.length == 0)
printf("The List is Empty!!!\n");
else
printf("The List is not Empty!!!\n");
return 0;
}

//求顺序表长度
status ListLength(Sqlist L)
{
printf("线性表的长度为%d\n", L.length);
return OK;
}

status DestroyList(Sqlist &L)
{
free(&L.elem[0]);
L.length=0;
return 0;
}

实验结果

链表操作

#include<malloc.h>

#include<stdlib.h>

typedef int Elemtype;

typedef int Status;

typedef struct LNode{

Elemtype data;

struct LNode *next;

}LNode,*LinkList;

//函数声明

Status CreatList1(LinkList &L, int n);                                   //头插法构建

Status PrintfList(LinkList L);                                          //链表输出

Status CreatList2(LinkList &L, int n);                                   //尾插法构建

Status InverseList(LinkList &L);                                            //逆置链表

int main()

{

LinkList L;

int n,i,e;

printf("请输入建立的线性表结点个数n=");

scanf_s("%d", &n);

CreatList1(L, n);

PrintfList(L);                                                   //头插法建立链表

printf("请输入建立的线性表结点个数n=");

scanf_s("%d", &n);

CreatList2(L, n);

PrintfList(L);                                                   //尾插法建立链表

InverseList(L);                                                //逆置链表

PrintfList(L);

}

//头插法创建链表

Status CreatList1(LinkList &L,int n)

{

int i;

LinkList p;

L = (LinkList)malloc(sizeof(LNode));

L->next = NULL;

for (i = n; i > 0; i--)

{

p = (LinkList)malloc(sizeof(LNode));

p->data = rand() % 100 + 1;

printf("头插法的第%d个数据:%d\n", i,p->data);

p->next = L->next;

L->next = p;

}

return 0;

}

//尾插法构建线性表

Status CreatList2(LinkList &L, int n)

{

LinkList p,q;

int i;

L = (LinkList)malloc(sizeof(LNode));

L->next = NULL;

for (q=L,i = 0; i < n;i++)

{

p = (LinkList)malloc(sizeof(LNode));

p->data = rand() % 100 + 1;

printf("尾插法的第%d个数据:%d", i + 1,p->data);

q->next = p;

q = p;

printf("\n");

}

q->next = NULL;

return 0;

}

//输出链表

Status PrintfList(LinkList L)

{

LNode *p;

if (L->next == NULL)

printf("The List is Empty!!!\n");

for (p = L->next; p != NULL; p = p->next)

printf("%3d ", p->data);

printf("\n");

return 0;

}

//逆置链表

Status InverseList(LinkList &L)

{

LinkList p,q;

for (p = L->next; p->next != NULL; p = p->next);

for (q = L->next; q != p; q = L->next)

{

L->next = q->next;

q->next = p->next;

p->next = q;

}

return 0;

}

实验结果

时间: 2024-12-28 15:04:25

c数据结构 顺序表和链表 相关操作的相关文章

8.基本数据结构-顺序表和链表

一.内存 - 计算机的作用:对数据进行存储和运算.首先我们需要知道我们目前使用的计算机都是二进制的计算机,就以为着计算机只可以存储和运算二进制的数据.例如下载好的一部电影,该电影可以存储到计算机中,计算机中存储的是基于二进制的电影数据,然后我们可以通过相关的视频播放软件结合相关的硬件对电影的二进制数据进行相关的运算操作,所产生的结果就是我们可以看到电影的画面和听到音频的声音. - 问题:阐述计算机如何计算1+2的结果? - 阐述:简单理解为,首先可以将1和2输入到计算机中,然后计算机会将1和2转

(数据结构)顺序表与链表的基本操作代码以及比较

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算

【数据结构】之顺序表和链表的比较

1.顺序表 顺序表的优点: (1) 方法简单,各种高级语言中都有数组,容易实现.(2) 不用为表示结点间的逻辑关系而增加额外的存储开销.(3) 顺序表具有按元素序号随机访问的特点. 顺序表的缺点: (1) 在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序表效率低.(2) 需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置:预先分配过小,又会造成溢出. 2.链表 链表的优点: (1) 在链表中做插入删除操作时,不会影响前面和后面的节点,因此对n较大的链表

《数据结构》复习之线性表(顺序表和链表)

线性表的概念 线性表的比较 线性表的数据结构 顺序表的算法操作 双链表的补充 总结 1.线性表的概念 线性表的存储结构有顺序存储结构和链式存储结构两种.前者成为顺序表,后者称为链表. 顺序表: 顺序表就是把线性表中的所有元素按照其逻辑顺序,一次存储到从指定的存储 位置开始的一块连续的存储空间中,如下图所示. 链表 在链表的存储中,每一个节点不仅包含所存元素本身的信息,还包含元素之间的逻辑关系的信息,即前驱节点包含后继节点的地址信息,这样就可以通过前驱节点中的地址信息方便地找到后继节点的位置,如下

数据结构 --- 02. 内存, 顺序表, 单链表

一.内存 1.基本概念 计算机的作用: 就是用来存储和运算二进制的数据 变量的概念: 就是计算机中的某一块内存空间   衡量计算机内存大小的范围: bit byte kb mb 计算机中内存空间都会有两个基本的属性 大小 地址 不同数据占用内存空间的大小 整数:4byte float:4byte double:8byte 字符:1byte 理解a=10的内存图(引用,指向) 指向:如果一个变量存储了某一块内存空间的地址,则表示该变量指向该块内存 引用:如果一个变量存储了某一块内存空间的地址,则该

【数据结构】顺序表和链表的比较

顺序表和链表各有短长.在实际应用中究竟选用哪一种存储结构呢?这要根据具体问题的要求和性质来决定.通常有以下几方面的考虑: ┌───┬───────────────┬───────────────┐ │      │       顺序表        │        链表          │ ├─┬─┼───────────────┼───────────────┤ │基│分│静态分配.程序执行之前必须明确│动态分配只要内存空间尚有空闲,│ │于│配│规定存储规模.若线性表长度n变 │就不会产

线性表-顺序表、链表类模板的实现(数据结构基础 第2周)

学习完课程后,自己用C++实现了简单的顺序表和链表,并用约瑟夫问题做了测试,不保证完全正确. 其中有一点需要注意一下:C++中类模板声明头文件和实现头文件不可以分离到.h和.cpp中,否则无法正常编译,详见:https://www.zhihu.com/question/20630104 源码 1.顺序表 //seqlist.h #pragma once #include <iostream> using namespace std; template <class T> class

线性表 及Java实现 顺序表、链表、栈、队列

数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值,至少在一段时间之后,技术可以很快得到提高.同时,它也是软考的重点,我们需要对这部分的内容进行一下总结. 我们先看一下数据结构和算法的整体内容. 1.线性表 概念: 数据元素的排列方式是线性的. 分类: 分类规则是根据上图中元素的存储结构来划分的. (1)顺序表 基本思想:元素的存储空间是连续的.在内