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

小弟苦于没有听顺序表与单链表的课,因此这个实验有困难,请教各位大人,以下实验应该如何做呢,用C或C++都可以:

实验内容与STEP

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

请用C/C++写下吧,感谢了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

//我前天给一位女生写的程序

#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;
}

//写得不好,请原谅.
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-03-27
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
typedef char datatype;
typedef struct node{
datatype data;
struct node *next;
} listnode;
typedef listnode *linklist;
listnode *p;
linklist createlist( )
{
char ch;
linklist L=(linklist)malloc(sizeof(listnode));/*附加一个头结点*/
listnode *p,*r;
r=L;
printf("请输入一些字符如:abcd按回车结束\n");
while((ch=getchar( ))!='\n'){
p=(listnode*)malloc(sizeof(listnode));
p->data=ch;
r->next=p;
r=p;
}
r->next=NULL;
return(L);
}
int insertnode(linklist L,char x,int i)
{
int j=0;
listnode *s;
p=L;
while(p&&j<i-1){
p=p->next;
++j;
}
if(!p||j>i-1)
{return 0;
exit(1);}
s=(linklist)malloc(sizeof(listnode));
s->data=x;
s->next=p->next;
p->next=s;
return 1;
}
int deletelist(linklist L,int i)
{
int j=0;
listnode *s;
p=L;
while(p&&j<i-1){
p=p->next;
++j;
}
if(!p->next||j>i-1)
{ return 0;
exit(1);}
s=p->next;
p->next=s->next;
free(s) ;
return 1;
}
void Print(linklist L)
{
p=L->next;
while(p)
{
printf("%c ",p->data);
p=p->next;
}
}

void main()
{
int loc,flag=1;
linklist L=createlist();
char j,ch;
int temp;
while(flag)
{ printf("\n请选择:\n");
printf("1.显示所有元素\n");
printf("2.插入一个元素\n");
printf("3.删除一个元素\n");
printf("4.退出程序\n");
scanf(" %c",&j);
switch(j)
{
case '1':Print(L); break; //显示所有元素
case '2':{printf("请输入要插入的元素(一个字符)和插入位置:\n");
printf("格式:字符,位置;例如:a,2\n");
scanf(" %c,%d",&ch,&loc); //输入要插入的元素和插入的位置
temp=insertnode(L,ch,loc); //插入
if(temp==0) printf("插入失败!\n"); //插入失败
else {printf("插入成功!\n"); Print(L);} //插入成功
break;
}
case '3':{printf("请输入要删除元素的位置:");
scanf("%d",&loc); //输入要删除的元素的位置
temp=deletelist(L,loc); //删除
if(temp==1) printf("删除了一个元素"); //删除成功
else printf("该元素不存在!\n"); //删除失败
Print(L);
break;
}

default:flag=0;printf("程序结束,按任意键退出!\n");
}
}
}
第2个回答  2008-04-05
单链表的
#include "stdio.h"
#include "malloc.h"
#define null 0
struct node /*定义结构体*/
{int data;
struct node *next;
};
struct node *head;
struct node *p;
struct node *s;
void creat() /*创建单链表*/
{int ch;
head=(struct node *)malloc(sizeof(struct node));
head->next=null;
p=head;
printf("请输入数据: ");
scanf("%d",&ch);
while(ch!=-1)
{s=(struct node *)malloc(sizeof(struct node));
s->data=ch;
s->next=null;
p->next=s;
p=s;
printf("请输入数据: ");
scanf("%d",&ch);
}
}
void outline() /*输出单链表*/
{p=head->next;
while(p!=null)
{printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int locate(int x) /*按值查找*/
{p=head->next;
while((p!=null)&&(p->data!=x))
p=p->next;
if(p==null) return 0;
else return (p->data);
}
int countnode() /* 计算结点的个数*/
{int i=0;
p=head->next;
while(p!=null)
{p=p->next;
i++;
}
return (i);
}
main() /*主函数*/
{int a=0;
creat();
outline();
printf("请输入你要找的数:\n");
scanf("%d",&a);
printf("你要找的数的下标是: %d\n",locate(a));
printf("结点个数是: %d\n",countnode());
}
第3个回答  2008-04-04
#ifndef _LinkLIST
#define _LinkLIST

#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 "LinkList.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 "linklist.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();
}
第4个回答  2008-03-27
http://zhidao.baidu.com/question/49480893.html
参照这个问题,很简单的例子。有顺序表和单链表两种
相似回答