用C或C++语言都可!急,建立顺序表与单链表,并进行定位、插入与删除操作。

由于我们要做这个实验,但是小弟苦于顺序表与单链表的知识没听,所以不得不请教各位高手啦:

实验内容与STEP

1、从键盘上输入十个数建立顺序表,并进行定位、插入与删除操作。
2、从键盘上输入五个数建立单链表,并进行定位、插入与删除操作。

请写一下语言吧!非常感谢了

////////////list.h//////////////
#ifndef _lianxi_
#define _lianxi_

#define LEN 30
typedef int ElemType;

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

class Linklist
{
LNode *head;
public:
Linklist();
~Linklist();
void Insertlist(ElemType item, int mark);
void Deletelist(ElemType& item, int pos);
void Traverselist(Linklist &list);
};
#endif

///////////////list.cpp/////////////
#include <iostream>
#include <iomanip>
#include "lianxi.h"
using namespace std;

Linklist::Linklist()
{
int i,m;

cout<<"是否初始化(1是,0否):";
cin>>i;
cout<<"请输入链表长度:";
cin>>m;
if(i&&m<=LEN)
{ElemType a[LEN+1];
for(int j=0;j<m;j++)
{cout<<"输入第"<<j+1<<"个值:";
cin>>a[j];}

head=new LNode;
LNode *p=head,*q;
for(j=0;j<m;j++)
{q=new LNode; q->data=a[j]; p->next=q; p=p->next;}
p->next=NULL;
}
else
throw ("error");
}
//////////////////////////////////////////////////////////////////////////
Linklist::~Linklist()
{
LNode *p=head->next, *q;
while(p)
{q=p->next;
free(p);
p=q;
}
cout<<"走到世界的尽头我对你始终无法忘记。。。。。。。。。。"<<endl;
for(int i=0;i<20;i++)
{for(int j=0;j<20;j++)
cout<<char(64);
cout<<endl;
}
}
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
void Linklist::Traverselist(Linklist &list)
{
LNode *p=head->next;
while(p){
cout<<setw(8)<<p->data;
p=p->next;
}
cout<<endl;
}
//////////////////////////////////////////////////////////////////////////
void Linklist::Deletelist(ElemType& item,int pos)
{
LNode *p=head,*q;
for(int i=0;i<pos-1;i++)
p=p->next;
item=p->next->data;
q=p->next->next;
free(p->next);
p->next=q;
}
//////////////////////////////////////////////////////////////////////////
void Linklist::Insertlist(ElemType item, int mark)
{LNode *q=new LNode;
q->data=item;
if(mark==0)
{q->next=head->next;
head->next=q;
return;
}
LNode *p=head;
while(p->next)
{p=p->next;}
q->next=NULL;
p->next=q;
}

//////////////main.cpp///////////////
#include <iostream>
#include "lianxicpp.h"
using namespace std;

void main()
{
int Pos,it,m;
ElemType item;
Linklist L;

L.Traverselist(L);
cout<<"\n要删除元素位置:";
cin>>Pos;
L.Deletelist(it,Pos);
L.Traverselist(L);
cout<<"在表首或表尾插入元素(0首,!=0尾):";
cin>>m;
cout<<"请输入要插入元素的值:";
cin>>item;
L.Insertlist(item,m);
L.Traverselist(L);

}
这个是顺序表

/////////////list.h//////////////
#ifndef _LIST3_
#define _LIST3_

#define LEN 30

typedef int ELemType;

typedef struct LNode
{
ELemType data;
LNode *next;
}LNode;

class LinkList
{
LNode *head;
public:
LinkList();
LinkList(int);
LinkList(int n, int m, int mark=0);
LinkList(LinkList& HL);
~LinkList();

void ClearList();
int ListSize();
bool ListEmpty();
ELemType GetElem(int pos);
void TraverseList(void f(ELemType &));
int FindList(ELemType& item);
bool UpdateList(const ELemType& item, ELemType e);
void InsertList(ELemType item, int mark);
bool DeleteList(ELemType& item, int mark);
void pailie(int mark=1);
void MergeList_L(LinkList &La, LinkList &Lb);
void OrderOutputList(int mark=0);
};

#endif

//////////////list.cpp///////////////
#include <iostream>
#include "linklist3.h"
using namespace std;

LinkList::LinkList()
{
head=new LNode;
head->next=NULL;
}

LinkList::LinkList(int dl)
{
head=new LNode;
head->next=new LNode;
head->next->data=dl;
head->next->next=NULL;
}

LinkList::LinkList(int n, int m, int mark/* =0 */)
{
int i,j;
ELemType a[LEN+1];
for(i=1;i<=n;i++)
a[i]=(m+rand())%100;
for(i=1;i<n;i++)
for(j=1;j<=n-i;j++)
{
int t;
if(mark>0&&a[j]>a[j+1]||mark<0&&a[j]<a[j+1])
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
head=new LNode;
LNode *p=head, *q;
for(i=1;i<=n;i++)
{
q=new LNode;
q->data=a[i]; p->next=q; p=p->next;
}
p->next=NULL;
}

LinkList::LinkList(LinkList& HL)
{
head=new LNode;
head->next=NULL;
LNode *p2=HL.head->next, *p1=head, *q;

while(p2)
{
q=new LNode;
q->data=p2->data;
p1->next=q;
p1=q;
p2=p2->next;
}
p1->next=NULL;
}

LinkList::~LinkList()
{
LNode *p=head->next, *q;
while(p)
{
q=p->next;
free(p);
p=q;
}
}

void LinkList::ClearList()
{
LNode *p=head->next, *q;
while(p)
{
q=p->next;
free(p);
p=q;
}
head->next=NULL;
}

int LinkList::ListSize()
{
LNode *p=head->next;
int i=0;
while(p)
{
i++;
p=p->next;
}
return i;
}

bool LinkList::ListEmpty()
{ return ListSize()==0;}

ELemType LinkList::GetElem(int pos)
{LNode *p=head->next;
int i=1;
while(p)
{
if(i++==pos) return p->data;
p=p->next;
}
LNode *q=head->next;
return q->data;
}

void LinkList::TraverseList(void f(ELemType &))
{LNode *p=head->next;
while(p)
{f(p->data);
p=p->next;
}}

int LinkList::FindList(ELemType &item)
{LNode *p=head->next;
int i=1;
while(p)
{if(p->data==item) return i;
p=p->next; i++;
}
return 0;
}

bool LinkList::UpdateList(const ELemType& item, ELemType e)
{LNode *p=head->next;
bool flag=0;
while(p)
{if(p->data==item)
{p->data=e;
flag=1;
}
p=p->next;
}
return flag;
}

void LinkList::InsertList(ELemType item, int mark)
{LNode *q=new LNode;
q->data=item;
if(mark==0)
{q->next=head->next;
head->next=q;
return;
}
LNode *p=head;
while(p->next)
{p=p->next;}
q->next=NULL;
p->next=q;
}

bool LinkList::DeleteList(ELemType& item, int mark)
{if(ListEmpty()||mark<1||mark>ListSize()) return 0;
LNode *p=head, *q;
for(int i=0;i<mark-1;i++)
p=p->next;
item=p->next->data;
q=p->next->next;
free(p->next);
p->next=q;
return 1;
}

void LinkList::pailie(int mark)
{ELemType a[LEN+1];
LNode *p=head->next;
int k;
for(k=1;p!=NULL;k++,p=p->next)
a[k]=p->data;
k--;
for(int i=1;i<k;i++)
for(int j=1;j<=k-i;j++)
{int t;
if(mark>0&&a[j]>a[j+1]||mark<0&&a[j+1]>a[j])
{t=a[j+1]; a[j+1]=a[j]; a[j]=t;}}
p=head->next;
for(int j=1;j<=k;j++,p=p->next)
p->data=a[j];
}

void LinkList::MergeList_L(LinkList &la , LinkList &lb)
{LNode *pa=la.head->next, *pb=lb.head->next, *p=head;
while(pa&&pb)
{LNode *q=new LNode;
if(pa->data<pb->data)
{q->data=pa->data;
pa=pa->next;
p->next=q;
p=q;
}
else
{q->data=pb->data;
pb=pb->next;
p->next=q;
p=q;
}}
while(pa)
{LNode *q=new LNode;
q->data=pa->data;
pa=pa->next;
p->next=q;
p=q;
}
while(pb)
{LNode *q=new LNode;
q->data=pb->data;
pb=pb->next;
p->next=q;
p=q;
}
p->next=NULL;
}

void LinkList::OrderOutputList(int mark)
{ELemType a[LEN+1];
LNode *p=head->next;
int k;
for(k=1;p!=NULL;k++,p=p->next)
a[k]=p->data;
k--;
for(int i=1;i<k;i++)
for(int j=1;j<=k-i;j++)
{int t;
if(mark>0&&a[j]>a[j+1]||mark<0&&a[j+1]>a[j])
{t=a[j+1]; a[j+1]=a[j]; a[j]=t;}}
for(int j=1;j<=k;j++)
cout<<a[j]<<" ";
}
/////////////////////main.cpp/////////
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstdio>
#include "linklist3cpp.h"

using namespace std;

void ff(int &a)
{cout<<a<<" ";}

void main()
{
/* */
LinkList list(5);
list.TraverseList(ff);
list.InsertList(6,1);
cout<<endl<<"插入后链表为:";
list.TraverseList(ff);
list.InsertList(7,0);
cout<<endl<<"插入后链表为:";
list.TraverseList(ff);
cout<<endl<<"链表有序输出:";
list.OrderOutputList(1);

/* */

cout<<"\nlinklist3m.cpp运行结果:\n";
int init_size, seed, xu;
cout<<"首先请构造单链表list1";
cout<<"\n初始化长度(1--30):";
cin>>init_size;
seed=150;
cout<<"是否排序:(=0不排序,=1升序,=-1降序):";
cin>>xu;

LinkList list1(init_size, seed, xu);
cout<<"\n单链表list1构造成功!"<<"\n它是:";
list1.TraverseList(ff);
cout<<"\n它为空吗?(1是,0不是):"<<list1.ListEmpty();
cout<<"\n长度为:"<<list1.ListSize()<<endl;

int i;
cout<<"请输入你要查找的元素值:";
cin>>i;
cout<<list1.FindList(i);
cout<<"\n请输入你想得到第几个元素的值(1--"<<init_size<<"):";
cin>>i;
cout<<"单链表list1中第"<<i<<"的值是"<<list1.GetElem(i);
int it;
cout<<"\n请输入你想删除第几个元素的值(1--"<<init_size<<"):";
cin>>i;
list1.DeleteList(it,i);
cout<<"\n单链表list1删除第"<<i<<"个元素"<<"\'"<<it<<"\'"<<"后变为:";
list1.TraverseList(ff);

int news,olds;
cout<<"\n请输入要被修改的元素:";
cin>>olds;
cout<<"请输入修改后要变成的元素:";
cin>>news;
list1.UpdateList(olds,news);
cout<<"\n修改后单链表list1变为: ";
list1.TraverseList(ff);
cout<<"\n下面请构造单链表list2";
cout<<"\n请输入单链表list2初始化长度(1--30):";
cin>>init_size;
seed=120;
cout<<"请选择是否排序:(=0不排序,=1升序,=-1降序):";
cin>>xu;
LinkList list2(init_size, seed, xu);
cout<<"\n单链表list2为:";
list2.TraverseList(ff);
LinkList list3;
list1.pailie();
list2.pailie();
list3.MergeList_L(list1,list2);
cout<<"\nlist1和list2合并之后为list3:\n";
list3.TraverseList(ff);
cout<<"\n这时它为空吗?(1是,0不是):"<<list3.ListEmpty();
cout<<"\n长度为:"<<list3.ListSize();
list3.ClearList();
cout<<"\n清空单链表list3\n";
cout<<"\n按回车键结束。。。";
cin.get(); cin.get();
}
这个是单链表
都是很简单的链表例子,很容易懂
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-03-27
#include <stdlib.h>
#include <stdio.h>

#define MAXSIZE 100
typedef struct{
char elem[MAXSIZE]; //用于储存线性表中的元素,元素类型为char;
int len; //线性表的当前表长,即elem数组中已经储存多少个char.
}SqList;

int insert_Sq(SqList *L, int i, char c) //参数i:插入的位置(数组elem中的位置),参数c:要插入的值
{
if (i<1 || i>L->len+1) {
printf("\n插入位置不合理!");
return 0; //判断i的值,若小于1或者大于表长加1,则位置不合理
}
if (L->len == MAXSIZE-1) return -1; //若当前表长等于elem的最大储存量减1,则无法插入

for(int j = L->len; j >= i; --j)
{
L->elem[j+1] = L->elem[j]; //插入位置之后的元素依次后移,且应该先移动最后面的元素
}
L->elem[i] = c;
++L->len; //插入新元素后,当前表长应该加1
printf("您成功插入了:%c\n", c);
return 1;
}
int Delete_Sq(SqList *L, int i) //删除elem中位置为i的元素,若能够删除,则后面元素依次左移
{
if (i<1 || i>L->len) return 0; //不合理的位置,无法进行删除
if (L->len == 0) return -1; //线性表为空,无法进行删除
for (int j = i; j <= L->len-1; j++)
{
L->elem[j] = L->elem[j+1]; //从最前面一个元素开始依次左移,直到最后一位元素结束
}
--L->len; //被删除一个元素后,当前表长减1
return 1;
}

int PrintOut(SqList *L) //打印线性表中的元素
{
if (L->len == 0) return 0; //当前表长为0,所以线性表为空,不能做打印操作
printf("线性表中元素为:");
for (int j = 1; j < L->len; j ++) //j为循环变量,遍历数组0位置到L->Len-1这个位置,依次打印
{
printf("%c", L->elem[j]);
}
}

int main()
{
SqList *s = (SqList *)malloc(sizeof(SqList));
s->len = 0;
char love[] = " I love you!";
for(int i = 1; i < sizeof(love); i ++)
{
insert_Sq(s, i, love[i]);
}
PrintOut(s);
Delete_Sq(s, 8);
Delete_Sq(s, 8);
Delete_Sq(s, 8);
insert_Sq(s, 8, 'u');
PrintOut(s);
insert_Sq(s, 14, 'u');
free(s);
getchar();
return 0;
}

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
/*栈操作主要根据top来进行,事实上规定top所指向的位置是没有值的*/
typedef struct
{
char elem[MAXSIZE]; //栈的最大容量为MAXSIZE
int top; //栈顶的值,即为elem数组中最后面的一个元素的位置
}SqStack;

void InitStack(SqStack *s)
{
s->top = 0; //当前top标记elem数组中0位置,说明栈为空
}
int Empty_Sq(SqStack *s) //判断栈是否为空
{
return (s->top == 0); //top为0,则返回true
}
int Push_Sq(SqStack *s, char c)
{
if (s->top == MAXSIZE)
{
printf("栈已满,不能做插入操作!");
return 0; //首先判断栈是否已满(当top标记为elem最后一个元素时)
}
s->elem[s->top] = c; //若栈没满,则将c放入当前top所指位置
s->top++; //然后top下移
printf("%c 成功进栈\n", c);
return 1;
}
int Pop_Sq(SqStack *s, char *y) //出栈操作,将top所指向的元素的下一位置的值保存在*y里
{
if(s->top == 0)
{
printf("栈为空,不能做出栈操作!");
return 0;
}
--s->top; //先让top指向它当前位置的前一个元素的位置
printf("当前元素 %d 出栈,它的值为 %c\n", s->top, s->elem[s->top]);
*y = s->elem[s->top]; //取出top现在指向的那个位置的元素,放入*y;即为出栈操作.

}
int main()
{
SqStack *s = (SqStack *)malloc(sizeof(SqStack));
InitStack(s); //初始化栈,让top为0;
char ch = 'c';
Push_Sq(s, 'a'); //连续三次进栈操作
Push_Sq(s, 'a');
Push_Sq(s, 'c');

Pop_Sq(s, &ch); //做一次出栈操作,数据保存在ch中
printf("%c", ch); //打印

Pop_Sq(s, &ch); //第二次出栈
printf("%c", ch);

Pop_Sq(s, &ch); //第三次出栈
printf("%c", ch);

Pop_Sq(s, &ch); //第四次出栈(当然这次会失败)
printf("%c", ch);
getchar();
return 0;
}本回答被提问者采纳
相似回答