线性表的顺序存储结构用C++实现

如题所述

线性表的顺序存储结构用C++实现代码:

#include "pch.h"

#include <stdio.h>

#include <malloc.h>

//#define DATA int 

typedef int DATA;

struct SNode

{

 DATA data;

 SNode* pNext;

};

SNode* g_pHead = NULL;

void AddHead(DATA data)

{

 SNode* p = (SNode*)malloc(sizeof(SNode));

 p->data = data; 

 p->pNext = g_pHead;

 g_pHead = p;

}

void Print()

{

 SNode* p = g_pHead;

 printf("List:");

 while (p)     //当节点的地址不为NULL

 {

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

  p = p->pNext;

 }

 printf("\n");

}

int main()

{

 AddHead(1);

 AddHead(2);

 AddHead(3);

 Print();

 return 0;

}

程序运行结果如下:



扩展资料:

双向链表框架:

#pragma once

typedef void* POSITION;

typedef int DATA;

struct SNode

{

 DATA data;

 SNode *pPrev, *pNext;

};

class CList

{

 SNode *m_pHead, *m_pTail;

 int m_nCount;

public:

 CList();

 ~CList();

 void RemoveAll();

 DATA GetNext(POSITION &pos);

 DATA GetPrev(POSITION &pos);

 void AddHead(DATA data);

 void AddTail(DATA data);

 void RemoveAt(POSITION pos);

};

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-09-29
这位兄弟好,下面是我写的一个程序,实现了以下操作(不知是不是你想要的,谢谢):
顺序表的表示和实现
(动态分配策略)
提示:类型定义
Typedef struct{
int * pData;
int nLength;
int nSize;
}SqList;
须完成的操作:
初始化 Init
销毁 Destroy
查找 Locate
插入 Insert
删除 Delete, DeleteAllx, DeleteSame
输出 ShowList,一行最多5个元素,
测试 testSqList
1. 从文件读入 n (n>10)个整数,填入顺序表;
2. 输出 n 个整数至屏幕;
3. 查找值为某个整数的元素的位序;
4. 在顺序表的头,尾,中间各插入一个元素
5. 输入修改后的表至屏幕,并保存至文件
6. 删除顺序表的任意两个元素,删除所有 x,删除相同元素
7. 输入修改后的表至屏幕,并保存至文件
8. 逆序排列顺序表,输出至屏幕,并保存至文件

源代码如下:

#include <iostream.h>
#include <fstream.h>

typedef struct{
int * pData;
int nLength;
int nSize;
}SqList;
const int MAXSIZE=100;

void Init(SqList *&pl); //从文件读入 n (n>10)个整数,填入顺序表
void Destroy(SqList *&pl); //销毁顺序表
int Locate(SqList *pl,int k); //查找值为某个整数的元素的位序
bool Insert(SqList *&pl,int loc,int key); //在loc这个位序插入key这个值
void ShowList(SqList *pl); //输出顺序表
bool Delete(SqList *&pl,int key); //删除key这个元素
void DeleteAllx(SqList *&pl); //删除所有元素
void DeleteSame(SqList *&pl); //删除相同元素
void save(SqList *pl); //把操作结果保存到文件
void reverseData(SqList *&pl); //倒置顺序表

int main()
{
SqList *pl=new SqList;
int key,loc;
bool flag;
Init(pl);
ShowList(pl);
save(pl);
cout<<"input the key you want to find!\n";
cin>>key;
loc=Locate(pl,key);
if (loc==-1)
{
cout<<"the key="<<key<<" is not in the list\n";
}
else
{
cout<<"the locate of "<<key<<" in the list is:"<<loc<<endl;
}
flag=Insert(pl,0,25);
if (flag)
{
cout<<"insert success!\n";
ShowList(pl);
save(pl);
}
else{
cout<<"insert failure!\n";
}
flag=Insert(pl,pl->nLength/2,26);
if (flag)
{
cout<<"insert success!\n";
ShowList(pl);
save(pl);
}
else{
cout<<"insert failure!\n";
}
flag=Insert(pl,pl->nLength,27);
if (flag)
{
cout<<"insert success!\n";
ShowList(pl);
save(pl);
}
else{
cout<<"insert failure!\n";
}
cout<<"input the data key that you want to Delete:\n";
cin>>key;
flag=Delete(pl,key);
if (flag)
{
cout<<"delete OK!\n";
}
else
{
cout<<"Can't find the number you want to delete!\n";
}
cout<<"after delete!\n";
ShowList(pl);
save(pl);
DeleteSame(pl);
cout<<"after delete same!\n";
ShowList(pl);
save(pl);
cout<<"after reverse!\n";
reverseData(pl);
ShowList(pl);
save(pl);
return 0;
}

void Init(SqList *&pl)
{
int i,number,n;
pl->pData=new int[MAXSIZE];
ifstream instuf("d:\\data.txt",ios::in);
ofstream idata("d:\\idata.txt",ios::out);
idata<<"This is the idata:\n";
idata.close();
if (!instuf)
{
cerr<<"File Could not be open!\n";
return;
}
i=0;
cout<<"input n:\n";
cin>>n;
while (instuf>>number)
{
pl->pData[i++]=number;
if (i==MAXSIZE)
{
cout<<"No more memory!\n";
break;
}
if (i+1>n)
{
break;
}
}
if (i<=MAXSIZE)
{
pl->nLength=i;
}
else
pl->nLength=MAXSIZE;
pl->nSize=MAXSIZE;
instuf.close();
}

void ShowList(SqList *pl)
{
if (pl->nLength==-1)
{
cout<<"empty list!\n";
}
for (int i=0;i<pl->nLength;i++)
{
cout<<pl->pData[i]<<"\t";
if (((i+1)%5)==0)
{
cout<<endl;
}
}
cout<<endl;
}

int Locate(SqList *pl,int k)
{
int i=0;
for (;i<pl->nLength;i++)
{
if (pl->pData[i]==k)
{
return i;
}
}
return -1;
}

bool Insert(SqList *&pl,int loc,int key)
{
cout<<"loc="<<loc<<" key="<<key<<endl;
if (loc<0||loc>pl->nSize-1||pl->nLength==pl->nSize)
{
return false;
}
int j=pl->nLength,i=pl->nLength;
for (;i>loc;j--)
{
i--;
pl->pData[j]=pl->pData[i];
}
pl->pData[i]=key;
pl->nLength++;
return true;
}

bool Delete(SqList *&pl,int key)
{
int flag=false;
cout<<"key="<<key<<endl;
for (int i=0;i<pl->nLength;i++)
{
if (pl->pData[i]==key)
{
flag=true;
int j=i+1;
for (;j<pl->nLength;j++,i++)
{
pl->pData[i]=pl->pData[j];
}
pl->nLength--;
break;
}
}
if (!flag)
{
return false;
}
return true;
}

void DeleteAllx(SqList *&pl)
{
pl->nLength=-1;
}

void Destroy(SqList *&pl)
{
delete []pl->pData;
pl->pData=NULL;
}

void DeleteSame(SqList *&pl)
{
int i,j,k,l;
for (i=0;i<pl->nLength;i++)
{
for (j=i+1;j<pl->nLength;j++)
{
if (pl->pData[i]==pl->pData[j])
{
l=j;
k=j+1;
for (;k<pl->nLength;k++,l++)
{
pl->pData[l]=pl->pData[k];
}
pl->nLength--;
}
}
}
}

void save(SqList *pl)
{
ofstream outstuf("d:\\idata.txt",ios::app);
int i=0;
while (i<pl->nLength)
{
outstuf<<pl->pData[i]<<' ';
i++;
}
outstuf<<'\n';
outstuf.close();
}

void reverseData(SqList *&pl)
{
int i=0,j=pl->nLength-1,temp;
for (;i<j;i++,j--)
{
temp=pl->pData[j];
pl->pData[j]=pl->pData[i];
pl->pData[i]=temp;
}
}

(程序运行说明:
1 首先手动在D盘目录下新建两个文本文件data.txt(用来保存源数据数据,在里面放入一些整数,用空格分开)和idata.txt(用来存放操作后的数据,2 程序即可运行)本回答被提问者采纳
第2个回答  推荐于2017-09-22
#include<iostream>
#include<string>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LinkList;
void CreatListR(LinkList *&L,ElemType a[],int n)
{
LinkList *s,*r;
int i;
//L=(LinkList *)malloc(sizeof(LinkList));
L=new LinkList();
r=L;
for(i=0;i<n;i++)
{
//s=(LinkList *)malloc(sizeof(LinkList));
s=new LinkList();
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void DispList(LinkList *L)
{
LinkList *p=L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int ListInsert(LinkList *&L,int i,ElemType e)
{
int j=0;
LinkList *p=L,*s;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
s=new LinkList();
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
}
int ListDelete(LinkList *&L,int i)
{
int j=0;
LinkList *p=L,*q;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
{
return 0;
}
else
{
q=p->next;
if(q==NULL)
{
return 0;
}
p->next=q->next;
int a=q->data;
free(q);
return a;
}
}
int main()
{
LinkList *L,*L1;
int a[]={1,5,7,9,12,18,19,20,30,43,45,56,41,42,78};
int n=15,i,x,y,j;
CreatListR(L,a,n);
DispList(L);
cout<<"请输入i"<<endl;
cin>>i;
cout<<"请输入x"<<endl;
cin>>x;
ListInsert(L,i,x);
DispList(L);
cout<<"请输入j"<<endl;
cin>>j;
y=ListDelete(L,j);
DispList(L);
cout<<y<<endl;
return 0;
}

用C语言实现线性表的顺序存储(创建,插入,删除和查找)
} for(p1=head;p1->next!=pfinished;)\/\/对链表进行从大到小排序(这里用冒泡法) \/\/p1使之总是指向头结点,pfinished使之总是指向已排序好的最前面的结点 \/\/ptemp作为中介,保存p2的上一个结点 { for(p2=p1;p2->next!=pfinished;) { if(*(&(p2->math)+num-'0')<*(&(p2->next->math)+num-'...

用c++实现线性表在顺序存储上的删除,判空,表置空操作
bool deleteElement(index){ if(index>0&&index<Maxsize){ deleted ary[index];return ture;} else return false;} 判空:bool isEmpty(){ if(ary[0] == null)return true;else return false;} 表置空:bool clear() { if(ary[0] == 0)return true;else for(int i = 0;i<Maxsize...

用C++方法实现顺序表线性表的建立、插入、删除和逆转操作。并用主函数...
include<iostream> using namespace std;typedef int ElemType;struct NodeType { ElemType data;NodeType *next;};class LinkList { private:NodeType *Head;public:LinkList();\/\/构造 ~LinkList();\/\/析构 void create();\/\/建表 void insert();\/\/插入 ElemType delet();void display();void inv...

怎样C++实现线性表的建立、插入、删除、倒序?
void Merge2List(SeqList L1,SeqList L2,SeqList *L3); \/\/对递增顺序表L1,L2求并集,即去重复,结果存放在顺序表L3中 void Merge3List(SeqList *L1,SeqList L2); \/\/对递增顺序表L1,L2进行合并,结果存放在顺序表L1中 void reverse(SeqList *L); \/\/逆置线性表函数 void delall(SeqList *L, DataType ...

如何用c++建立一个线性表?
用c++建立一个线性表有以下5步:1、准备数据:定义了顺序表的最大长度MAXLEN、顺序表数据元素的类型DATA以及顺序表的数据结构SLType。在数据结构SLType中,Listen为顺序表已存结点的数量,也就是当前顺序表的长度,ListData是一个结构数组,用来存放各个数据结点。我们认为该顺序表是一个班级学生的记录。...

求一个c++的建立线性表最简单的程序,要能运行的
{ \/\/ 操作结果:构造一个空的顺序线性表 L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if (!L.elem)exit(OVERFLOW); \/\/ 存储分配失败 L.length = 0; \/\/ 空表长度为0 L.listsize = LIST_INIT_SIZE; \/\/ 初始存储容量 return OK;} Status DestroyList(SqList &L){ \/...

用C++建立一个线性表,输入10个数,并按从小到大显示出来
{ \/* 操作结果:构造一个空的顺序线性表*\/ L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L.elem)exit(OVERFLOW); \/* 存储分配失败*\/ L.length=0;\/* 空表长度为0 *\/ L.listsize=LIST_INIT_SIZE;\/* 初始存储容量*\/ return OK;} Status ListInsert_Sq(SqList &L,...

【100分】数据结构——使用C语言(线性表)
using namespace std;\/\/c++的一个指令 typedef struct { int *elem; \/\/存储空间基址 int length; \/\/当前长度 int listsize;\/\/当前分配的存储容量 \/\/ (以sizeof(ElemType)为单位)\/\/int *next;}sqlist;void initList(sqlist &La){\/\/构造一个空线性表L La.elem=(int *) malloc(100 ...

用C语言编写程序实现顺序表的插入操作,并且从键盘读取元素给顺序表初...
在你的基础上改的 include<stdio.h> include<stdlib.h> define LISTSIZE 100 define ADD 10 typedef struct { int *elem;int length;int listsize;}List;\/\/定义线性表的结构体 void SqList(List &L){ \/\/int i;\/\/C++中C程序的变量定义放在开始 L.elem=(int *)malloc(LISTSIZE*sizeof(int...

我用c++实现一个线性顺序表,用的是void类型,没有返回值,用if后,return...
函数前面加void就是没有返回值的意思,如果加了void,函数中就不必出现return语句。如果函数中有“return;”语句,执行到这里,会跳出函数。注意是“return;”,不是“return()”。加分号就行了,不要加括号。

相似回答