当前位置:首页 » 操作系统 » 销毁线性表算法

销毁线性表算法

发布时间: 2022-06-08 06:48:36

⑴ 如何算是销毁一个线性表

不可以直接释放头结点的,必须所有的结点全部释放掉,最后释放头结点
如果直接将头结点置空,会导致其它结点元素所占空间不被有效释放,产生内存泄露

一个比较规正的清空线性表的代码如下:
void DestroyList(LinkList *L)//初始条件:线性表L已存在。 操作结果:销毁线性表L。
{
LNode Head, P;
if(*L)//若线性表L已存在
{
Head = *L;
P = Head->next;
while(!P) //把链表中除头结点外的所有结点释放
{
free(Head);
Head = P;
P = Head->next;
}
free(Head); //释放头结点
}
}

⑵ 顺序表、链表清空和销毁

我正好在学数据结构,以下是我的理解,自以为还比较靠谱。你参考着看吧。
ClearList只是把线性表中原来存储元素的空间中存的那些元素都清除了,类似于把原线性表改成一个空的线性表,但这个线性表是确实存在的。
而Destroy是把整个线性表占的空间都释放了,这个线性表结构都不存在了,下次想做一个线性表只能重新初始化。
下面是我在老师给的课件找到的粗略算法
顺序表的:
销毁线性表L
void DestroyList(SqList*L)
{
if (L->elem) free(L->elem); //释放线性表占据的所有存储空间
}
清空线性表L
void ClearList(SqList*L)
{
L->length=0; //将线性表的长度置为0
}
链表的:
销毁链表L
void DestoryList(LinkList *L)
{
NODE *p;
while (L->head){ //依次删除链表中的所有结点
p=L->head; L->head=L->head->next;
free(p);
}
}
清空链表L
void ClearList(LinkList *L)
{
NODE *p;
while (L->head->next){
p=L->head->next; //p指向链表中头结点后面的第一个结点
L->head->next=p->next; //删除p结点
free(p); //释放p结点占据的存储空间
}
}
具体的在C环境编程实现的话还要加工下的。
希望能给你点启发!

⑶ 设计算法删除线性表中的多余元素

Node*p=head;
while(p->next!=NULL){
inta=p->data;
intb=p->next.data;
if(a==b){
p->next=p->next->next;
}

p=p->next;

是不是就行了。。

⑷ 线性表的基本操作c语言实现

代码如下:

头文件:

2_1.h

#ifndef _2_1_H

#define _2_1_H

typedef void SeqList;

typedef void SeqListNode;

//创建线性表

SeqList * SeqList_Create(int capacity);

//销毁线性表

void SeqList_DesTroy(SeqList * list);

void SeqList_Clear(SeqList* list);

int SeqList_Length(SeqList* list);

int SeqList_Capacity(SeqList* list);

int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);

SeqListNode* SeqList_Get(SeqList* list, int pos);

SeqListNode* SeqList_Delete(SeqList* list, int pos);

#endif

源文件:

// 顺序线性表.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include <malloc.h>

#include <stdlib.h>

#include "2_1.h"

typedef unsigned int TSeqListNode;

typedef struct {

int len; //长度

int capacity;//总长度

TSeqListNode * node;//每个节点的指针

} TSeqList;

int main()

{

SeqList* list = SeqList_Create(5);//创建线性表

int i = 6;//赋值6个变量,已超过线性表最大值 5

int j = 1;

int k = 2;

int x = 3;

int y = 4;

int z = 5;

int index = 0;

SeqList_Insert(list, &i, 7); //将这6个变量插入线性表中

SeqList_Insert(list, &j, 0);

SeqList_Insert(list, &k, 0);

SeqList_Insert(list, &x, 0);

SeqList_Insert(list, &y, 0);

SeqList_Insert(list, &z, 0);

//遍历

for(index=0; index<SeqList_Length(list); index++)

{

int* p = (int*)SeqList_Get(list, index);

printf("%d ", *p);

}

printf(" ");

//删除操作

while( SeqList_Length(list) > 0 )

{

int* p = (int*)SeqList_Delete(list, 0);

printf("删除了: %d ", *p);

}

SeqList_Clear(list);

SeqList_DesTroy(list);

system("pause");

return 0;

}

//创建线性表

SeqList * SeqList_Create(int capacity)

{

TSeqList* ret = NULL ;

if(capacity >= 0)

{

ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode)*capacity); //为线性表分配空间,包含结 //构体和节点的总大小

}

if(NULL != ret)

{

ret->len = 0;

ret->capacity = capacity;

ret->node = (TSeqListNode*)(ret + 1);//将节点指向上述分配到的空间的后部分

}

return ret;

}

//销毁

void SeqList_DesTroy(SeqList * list)

{

free(list);

}

//清空

void SeqList_Clear(SeqList* list)

{

TSeqList * ret = (TSeqList*)list;

if(NULL != ret)

{

ret->len = 0;

}

}

//获得线性表的长度

int SeqList_Length(SeqList* list)

{

TSeqList * ret = (TSeqList*)list;

int len = -1;

if(NULL != ret)

{

len = ret->len;

}

return len;

}

//线性表的总长度

int SeqList_Capacity(SeqList* list)

{

TSeqList * ret = (TSeqList*)list;

int capacity = -1;

if(NULL != ret)

{

ret->capacity = capacity;

}

return capacity;

}

//插入

int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)

{

TSeqList * sList = (TSeqList*)list;

int i,ret = -1;

if((sList != NULL) &&(pos >= 0) && sList->capacity >= sList->len+1)

{

if(pos >= sList->len)

{

pos = sList->len;

}

for(i = sList->len; i > pos; i--)

{

sList->node[i] = sList->node[i-1];

}

sList->node[i] = (TSeqListNode)node;

++sList->len;

ret = 1;

}

return ret;

}

//获得指定位置的节点

SeqListNode* SeqList_Get(SeqList* list, int pos)

{

TSeqList * sList = (TSeqList*)list;

TSeqListNode* node = NULL;

if(NULL != sList && pos>=0 && pos < sList->len)

{

node = (TSeqListNode*)sList->node[pos];

}

return node;

}

//删除

SeqListNode* SeqList_Delete(SeqList* list, int pos)

{

TSeqList * sList = (TSeqList*)list;

SeqListNode * node = SeqList_Get( list, pos);

int i;

if(sList != NULL && pos >= 0 && pos< sList->len)

{

for( i=pos+1; i<sList->len; i++)

{

sList->node[i-1] = sList->node[i];

}

sList->len--;

}

return node;

}

演示:

资料拓展:

线性表是最基本、最简单、也是最常用的一种数据结构。

线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点)。

我们说“线性”和“非线性”,只在逻辑层次上讨论,而不考虑存储层次,所以双向链表和循环链表依旧是线性表。

在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。受限线性表主要包括栈和队列,受限表示对结点的操作受限制。

线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。

⑸ 1:线性表及其应用 (1): 顺序表操作验证(包括建立、查找、插入、删除、销毁等操作) (2):单链表操

随便找本算法书都有啊

⑹ 线性表删除元素的算法

如果是数组,那么把第i个之前的元素都往前移一位,需要O(n)的时间
如果是链表,那么把第i+1个元素直接接到第i-1个元素后面来,需要O(1)的时间。

⑺ 怎样用C语言摧毁线性表

线性表实际上就是一个数组,清空操作就意味着清除数组当前保存的所有元素,表的长度归0,以后的数组插入操作要从0下标元素开始,所以也就不需要再费时去一个一个清除元素值,或者重新分配数组空间了,直接将长度归0就可以了,之后在插入元素时(清空后的第一个操作只能是插入元素,不能取元素或者删除元素)通过表长度判断应该插入到何处(清空后的第一次插入只能放在0下标位置)。

所以,书上的说法是正确的,照书上的来就可以了,当然如果定义了一个指针,那么首先要用malloc()等函数分配空间,然后再L->Length=0;

⑻ 线性表销毁的详细介绍

要销毁的话从头结点开始依次free 但注意先得到下一个节点再free

⑼ 一个线性表采用顺序表表示,设计一个算法,删除其中所有值等于X的元素完整的C语言程序

#include<stdio.h>
#include<stdlib.h>

#defineElemTypeint
#defineStatusint
#defineOVERFLOW-1
#defineERROR0
#defineOK1

/*线性表的动态分配顺序存储结构*/
#defineLIST_INIT_SIZE10/*线性表存储空间的初始分配量*/
#defineLIST_INCREMENT2/*线性表存储空间的分配增量*/
typedefstruct{
ElemType*elem;/*存储空间基址*/
intlength;/*当前长度*/
intlistsize;/*当前分配的存储容量(以sizeof(ElemType)为单位)*/
}SqList;

/*操作结果:构造一个空的顺序线性表L*/
voidInitList(SqList*L){
L->elem=malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)
exit(OVERFLOW);/*存储分配失败*/
L->length=0;/*空表长度为0*/
L->listsize=LIST_INIT_SIZE;/*初始存储容量*/
}

/*初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L*/
voidDestroyList(SqList*L){
free(L->elem);
L->elem=NULL;
L->length=0;
L->listsize=0;
}

/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1*/
/*操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1*/
StatusListInsert(SqList*L,inti,ElemTypee){
ElemType*newbase,*q,*p;
if(i<1||i>L->length+1)/*i值不合法*/
returnERROR;
if(L->length>=L->listsize){/*当前存储空间已满,增加分配*/
newbase=realloc(L->elem,(L->listsize+LIST_INCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);/*存储分配失败*/
L->elem=newbase;/*新基址*/
L->listsize+=LIST_INCREMENT;/*增加存储容量*/
}
q=L->elem+i-1;/*q为插入位置*/
for(p=L->elem+L->length-1;p>=q;--p)/*插入位置及之后的元素右移*/
*(p+1)=*p;
*q=e;/*插入e*/
++L->length;/*表长增1*/
returnOK;
}

/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)*/
/*操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1*/
StatusListDelete(SqList*L,inti,ElemType*e){
ElemType*p,*q;
if(i<1||i>L->length)/*i值不合法*/
returnERROR;
p=L->elem+i-1;/*p为被删除元素的位置*/
*e=*p;/*被删除元素的值赋给e*/
q=L->elem+L->length-1;/*表尾元素的位置*/
for(++p;p<=q;++p)/*被删除元素之后的元素左移*/
*(p-1)=*p;
L->length--;/*表长减1*/
returnOK;
}

/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)*/
/*操作结果:打印顺序线性表所有元素*/
voidOutputList(SqList*L){
ElemType*p;
inti;
p=L->elem;/*p的初值为第1个元素的存储位置*/
for(i=1;i<=L->length;i++,p++)
printf("%d ",*p);
putchar(' ');
}

intmain(){
SqListL;/*定义顺序表*/
ElemType*p,e;
inti;

ElemTypeX=5;/*程序欲删除元素值为X的元素*/

InitList(&L);/*初始化顺序表*/
/*插入若干元素*/
ListInsert(&L,1,1);
ListInsert(&L,1,2);
ListInsert(&L,3,5);
ListInsert(&L,4,3);
ListInsert(&L,5,5);
ListInsert(&L,6,4);

printf("初始顺序线性表内容为: ");
OutputList(&L);
putchar(' ');

/*删除元素值为x的元素*/
p=L.elem;/*p的初值为第1个元素的存储位置*/
for(i=1;i<=L.length;i++,p++){
if(*p==X){
ListDelete(&L,i,&e);
printf("第%d个元素,其值为%d,已删除! ",i,e);
}
}
putchar(' ');

printf("删除元素值为x的元素之后顺序线性表内容为: ");
OutputList(&L);
putchar(' ');

getch();
return0;
}

运行结果

⑽ 求助,线性表的销毁

销毁是头结点都没有了,不存在了,置空还有个头结点吧

热点内容
按位与java 发布:2024-11-01 08:39:44 浏览:54
鸟哥linux私房菜服务器 发布:2024-11-01 08:26:19 浏览:942
tomcat在linux下配置 发布:2024-11-01 08:09:57 浏览:94
工行密码器怎么买东西 发布:2024-11-01 08:00:02 浏览:711
查找子串的算法 发布:2024-11-01 07:58:25 浏览:214
最快学编程 发布:2024-11-01 07:30:56 浏览:527
买福克斯买哪个配置好 发布:2024-11-01 07:01:07 浏览:36
pip更新python库 发布:2024-11-01 06:42:57 浏览:666
忆捷加密软件 发布:2024-11-01 06:34:05 浏览:353
androidlistview事件冲突 发布:2024-11-01 06:23:14 浏览:858