① 来人求救啊~~~实现线性顺序表的操作 c语言
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;
#defineLIST_INIT_SIZE100/*初始分配的顺序表长度*/
#defineLISTINCREMENT10/*溢出时,顺序表长度的增量*/
typedefintElemType;/*定义表元素的类型*/
typedefstructsqlist{
ElemType*elem;/*存储空间的基地址*/
intlength;/*顺序表的当前长度*/
intlistsize;/*当前分配的存储空间*/
}SqList;
StatusInitList_Sq(SqList&L){//算法2.3
//构造一个空的线性表L。
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)returnERROR;//存储分配失败
L.length=0;//空表长度为0
L.listsize=LIST_INIT_SIZE;//初始存储容量
returnOK;
}//InitList_Sq
StatusInsertDatum(SqList&L,ElemTypex){
inti;
for(i=0;i<L.length;++i){
if(L.elem[i]==x){
printf("表中有元素%d,插入失败。 ",x);
returnERROR;
}
}
if(L.length==L.listsize){
L.elem=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!L.elem)returnERROR;
L.listsize+=LISTINCREMENT;
}
for(i=L.length;i>0;--i)
L.elem[i]=L.elem[i-1];
L.elem[0]=x;
++L.length;
returnOK;
}
StatusModifyDatum(SqList&L,ElemTypex,ElemTypey){//把值x改为y
inti;
for(i=0;i<L.length;++i){
if(L.elem[i]==y){
printf("位置%d有数据%d。 ",i+1,y);
printf("替换失败! ");
returnERROR;
}
}
for(i=0;i<L.length;++i){
if(L.elem[i]==x){
L.elem[i]=y;
returnOK;
}
}
printf("表中没有元素%d,修改失败。 ",x);
returnERROR;
}
StatusDeleteDatum(SqList&L,ElemTypex){
inti,flag=0;
for(i=0;i<L.length&&!flag;++i)
if(L.elem[i]==x)flag=1;
if(flag==0||L.length==0){
printf("表中没有找到元素%!删除失败。 ",x);
returnERROR;
}
for(;i<L.length-1;++i)
L.elem[i]=L.elem[i+1];
--L.length;
returnOK;
}
intFindDatum(SqList&L,ElemTypex){
inti;
for(i=0;i<L.length;++i)
if(L.elem[i]==x)returni+1;
printf("没有找到元素%d。 ",x);
return0;
}
voidShow(SqList&L){
for(inti=0;i<L.length;++i){
if(i%10==0)printf(" ");
printf("%5d",L.elem[i]);
}
printf(" ");
}
voidDestroyList(SqList&L){
if(L.elem)free(L.elem);
}
intmain(){
inti,pos;
ElemTypex,y;
SqListL;
srand((unsigned)time(NULL));
if(!InitList_Sq(L)) {
printf("初始化未成功。");
return1;
}
for(i=0;i<LIST_INIT_SIZE;++i)
if(InsertDatum(L,rand()%1000)==ERROR)--i;
Show(L);
printf("请输入待插入数据:");
scanf("%d",&x);
InsertDatum(L,x);
Show(L);
printf("测试替换函数! ");
printf("请输入被替换数和替换数:");
scanf("%d%d",&x,&y);
ModifyDatum(L,x,y);
Show(L);
printf("请输入欲查询数据:");
scanf("%d",&x);
pos=FindDatum(L,x);
if(pos!=-1)printf("%d在位置%d。 ",x,pos);
Show(L);
DestroyList(L);
return0;
}
② C语言线性顺序表的插入和删除
#include"stdio.h"
#include"malloc.h"
#include"iostream.h"
typedef int status;
typedef int elementype;
#define INITSIZE 100
#define INCREMENT 2
struct sqlist
{
elementype *elem;
int length;
int listsize;
};
//建立链表,并排列数据
status listinit(sqlist &l)
{
int i=0,x,j,t;
l.elem=(elementype *)malloc(INITSIZE*sizeof(elementype));
if(!l.elem)
{
cout<<"建表失败"<<endl;
return 0;
}
l.length=0;
l.listsize=INITSIZE;
while(1)
{
cout<<"请输入数据(输入0时结束):";
cin>>x;
if(x==0) break;
l.elem[i]=x;
++l.length;
i++;
}
for(i=0;i<l.length-1;i++)
for(j=0;j<l.length-i-1;j++)
if(l.elem[j]>l.elem[j+1])
{
t=l.elem[j+1];
l.elem[j+1]=l.elem[j];
l.elem[j]=t;
}
cout<<"排序成功"<<endl;
return 1;
}
//插入数据
status listinsert(sqlist &l,int i,elementype e)
{
elementype *p,*q,*newbase;
if(i<1||i>l.length)
{
cout<<"i输入错误"<<endl;
return 0;
}
if(l.length>=l.listsize)
{
newbase=(elementype*)realloc(l.elem,(l.listsize+INCREMENT)*sizeof(elementype));
if(!newbase)
{
cout<<"申请空间失败"<<endl;
return 0;
}
l.elem=newbase;
l.listsize=l.listsize+INCREMENT;
}
q=&(l.elem[i-1]);
for(p=&(l.elem[l.length-1]);p>=q;--p)
{
*(p+1)=*p;
}
*q=e;
++l.length;
cout<<"插入成功";
return 1;
}
//删除数据
status listdelete(sqlist &l,int i,elementype &e)
{
elementype *p,*q;
if(i<1||i>l.length)
{
cout<<"i输入错误"<<endl;
return 0;
}
p=&(l.elem[i-1]);
e=*p;
q=l.elem+l.length-1;
for(++p;p<=q;++p)
{
*(p-1)=*p;
}
--l.length;
cout<<"删除成功"<<endl;
free(&e);
return 1;
}
//删除重复的数据
status listdeleterepeat(sqlist &l)
{
int i,j;
elementype *p,*q,e;
for(i=0;i<l.length-1;i++)
for(j=i+1;j<l.length-1;j++)
if(l.elem[i]==l.elem[j])
{
p=&(l.elem[j]);
e=*p;
q=l.elem+l.length-1;
for(++p;p<=q;++p)
{
*(p-1)=*p;
}
--l.length;
free(&e);
j--;
}
return 1;
}
//输出顺序表数据
status displaylist(sqlist &l)
{
int i;
cout<<"顺序表的数据为:"<<endl;
for(i=0;i<l.length;i++)
{
cout<<l.elem[i]<<" ";
}
cout<<endl;
return 1;
}
//查找数据
status locatelem(sqlist &l,int x)
{
elementype *p;
int i=1;
p=l.elem;
while(i<l.length&&(*p++)!=x)
i++;
cout<<i<<endl;
return 1;
}
//清空列表
void listclear(sqlist &l)
{
l.length=0;
}
//销毁顺序表
void listdestroy(sqlist &l)
{
if(l.elem)
free(l.elem);
}
//求顺序表长度
status listlength(sqlist &l)
{
cout<<"顺序表的长度为:"<<l.length<<endl;
return 1;
}
int main()
{
sqlist l;
int a,i,x;
elementype e;
cout<<"*************************************************"<<endl;
cout<<"* 顺序表的表示和实现 *"<<endl;
cout<<"*************************************************"<<endl;
do{
cout<<"*************************************************"<<endl;
cout<<"* 菜单 *"<<endl;
cout<<"* 1.建立顺序表 *"<<endl;
cout<<"* 2.插入数据 *"<<endl;
cout<<"* 3.删除数据 *"<<endl;
cout<<"* 4.删除重复数据 *"<<endl;
cout<<"* 5.清空数据 *"<<endl;
cout<<"* 6.查找数据 *"<<endl;
cout<<"* 7.顺序表的长度 *"<<endl;
cout<<"* 8.显示顺序表 *"<<endl;
cout<<"* 0.退出顺序表 *"<<endl;
cout<<"*************************************************"<<endl;
cout<<"输入你的选择:";
cin>>a;
switch(a)
{
case 1: listinit(l);
displaylist(l);
break;
case 2: cout<<"请输入要插入数据的位置:";
cin>>i;
cout<<"请输入要插入的数据元素:";
cin>>e;
listinsert(l,i,e);
displaylist(l);
break;
case 3: cout<<"请输入要删除的数据的位置:";
cin>>i;
listdelete(l,i,e);
displaylist(l);
break;
case 4: cout<<"删除前的数据为:";
displaylist(l);
listdeleterepeat(l);
cout<<"删除后的数据为:";
displaylist(l);
break;
case 5: cout<<"清空前为:";
displaylist(l);
cout<<"清空后为:";
listclear(l);
displaylist(l);
break;
case 6: cout<<"输入你要查找的数据:";
cin>>x;
cout<<"你要查找的数据的位置为:";
locatelem(l,x);
displaylist(l);
break;
case 7: cout<<"顺序表的长度为:";
listlength(l);
break;
case 8: displaylist(l);
break;
default: break;
}
}while(a!=0);
return 1;
}
③ 利用c语言实现顺序存储线性表的插入!
有时会出现这种情况。他会以为是木马。
int GetElem();
int InstInsert();
typedef int ElemType;
typedef struct{
ElemType *elem; //存储空间基地址
int length; //当前长度
int listsize;//当前分配的存储容量
}SqList;
int InitList(SqList *L){
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)exit(-1);//存储空间分配失败
L->length=0; //空表长度为0
L->listsize=LIST_INIT_SIZE; //初始存储容量
printf("线性链表创建成功\n");
return OK;
}
int Input(SqList *L){
ElemType temp,*newbase;
printf("输入顺序列表的数据,以0为结束标志\n");
scanf("%d",&temp);
while(temp!=0){
if(L->length>=L->listsize){
newbase=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!newbase) exit(-1);//存储空间分配失败
L->elem=newbase; //空间新基地址
L->listsize+=LISTINCREMENT; //增加存储容量
}
L->elem[L->length++]=temp;
scanf("%d",&temp);
}
printf("输入数据结束!!\n");
return OK;
}
int Onput(SqList *L){
int i=0;
printf("输出线性表数据:");
while(i<L->length){
printf("%d\t",L->elem[i]);
i++;
}
printf("\n");
}
int ClearList(SqList *L){
L->length=0;
printf("清除成功!\n");
return OK;
}
void ListEmpty(SqList L){
if(L.elem!=NULL)
printf("true!\n");
else
printf("false!\n");
}
void ListLength(SqList L){
printf("线性表的长度是:%d\n",L.length);
return ;
}
int GetElem(SqList L,int i,SqList *e){
e=L.elem[i-1];
return e;
}
void PriorElem(SqList L,int cur_e,SqList *pre_e){
if(cur_e!=L.elem[0]){
pre_e=L.elem[0];
printf("前驱值为:%d\n",pre_e);
}
else
printf("pre_e无意义\n");
}
void NextElem(SqList L,int cur_e,SqList *next_e){
if(cur_e!=L.elem[L.length-1]){
next_e=L.elem[L.length-1];
printf("后继值为:%d\n",next_e);
}
else
printf("next_e无意义\n");
}
int ListInsert(SqList *L,int i,int e){
ElemType *newbase,*p,*q;
if(1>i||i>(L->length+1))
return -1;
if(L->length>=L->listsize){ //新增内存
newbase=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //开辟新内存空间
if(!newbase)
exit(-1); //存储分配失败
L->elem=newbase; //新基地址
L->listsize+=LISTINCREMENT; //新增内存容量
}
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;p--){
*(p+1)=*p;
}
*q=e;
++L->length;
return OK;
}
int ListDelete(SqList *L,int i,int e){
ElemType *p,*q;
if(i<1||i>L->length)
return -1;
q=&(L->elem[i-1]);
e=L->elem[i-1];
p=L->elem+L->length-1;
for(;p>=q;q++)
*q=*(q+1);
--L->length;
printf("删除的值为:%d\n",e);
return OK;
}
④ 用c语言建立一个顺序存储的线性表,实现线性表的插入、删除操作
链表
1。是由结构体和指针构成的。
2。包括两个部分一个是数据域和指针域。
3。链表中的结点分为两类:头结点和一般结点。头结点是没有数据域的。
4。基本操作有:初始化链表,增加结点和删除结点,求链表的长度等等。
struct Linknode{
int data;
struct Linknode *next;
};
这个地方有个知识点:这个是链表的数据结构是有结构体和指针构成。结构体名为Linknode.但这里面没有定义结构体变量,只有我们定义了结构体变量才能使用结构体。
结构体变量怎么定义呢?
有两种方式:
1。struct Linknode Linklist;
2.typedef struct linknode Linklist.
一般我们都希望采用第2种,这样的好处是: 当我们再定义结构体变量时,可以用:Linklist p;而如果我们采用第一种还必须采用 struct Linknode p;对比一下就可以知道第2种要简单很多。那么下面我们都采用第2种方式来定义结构体变量。
上面我们已经定义了一个链表:
1。初始化链表。
#include<stdio.h>
#include<stdlib.h>
int InitLinkList(Linklist **Lnode)
{
*Lnode=(Linklist)malloc(sizeof(Linklist));//*Lnode等于L,对与*Lnode的分配空间相当与对主函数中的L分配空间。
if(!*Lnode)
return 0;
(*Lnode)->next=NULL;
}
在初始化链表的时候,我们用到了2级指针为什么呢?因为我们希望在InitLinkList函数生成的头结点,主函数中也能指向这个头结点。如果我们用一级指针的话,用malloc分配空间的时候,它将会返回分配空间的首地址给指针变量Lnode,而不能使是的空间被主函数中指针变量L得到这个地址。所以我们要用2级指针。
void main()
{
Linklist *L;
InitLikList(&L);
}
2。增加链表结点
增加链表结点其实很简单,一般用到三个结构体指针变量和一个循环结构。
InsertLinkList(Linklist *Lnode)
{
Linklist *p,*q;
int d;
{
scanf("%d",&d);
if(d==-9999)
break;
p=Lnode->next;//p指向头结点
//通过while循环和指针变量p定位要插入的结点q的位置。
while(p)
p=p->next;
//生成一个要插入的结点
q=(Linklist)malloc(sizeof(Linklist));//申请要插入的结点空间
q->data=d;//填充要插入结点的数据域
q->next=p->next;//首先填充要插入结点q的指针域进行填充。
p->next=q;//然后把定位好的p指针域进行修改指向q.
}while(9);//循环退出的条件是输入的数据-9999
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一个头结点
InsertLinkList(L);//插入结点
}
3。求链表的长度:
int LengthLinkList(Linklist *Lnode)
{
int i=0;
Linklist *p;
p=Lnode->next;//p指向链表的第一个结点。
while(p)
{
i++;
p=p->next;
}
return i;
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一个头结点
InsertLinkList(L);//插入一个结点
LengthLinkList(L)//求链表的长度。
}
4.删除结点
删除链表结点其实很简单,一般用到三个结构体指针变量和一个循环结构。
DestroyLinkList(Linklist *Lnode)
{
Linklist *p,*q;
p=Lnode;//p指向链表的头结点
while(p)
{
q=p->next;//q指向当前结点的下一个结点。
free(p);//释放当前结点
p=q;//p指向下一个结点
}
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一个头结点
InsertLinkList(L);//插入结点
LengthLinkList(L)//求链表的长度。
DestroyLinkList(L);//删除链表结点
}
⑤ 急求助高手大虾:C语言数据结构顺序线性表的实现
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream.h>
#define LIST_INIT_SIZE 50
#define LISTINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define CANCEL 0
typedef struct{
int *elem;
int length;
int listsize;
}sqlist;
int compare(int X,int Y)
{if(X==Y)
return X;
else return FALSE;
}//compare的关系判断
void visit(int &y)
{
y=2*y;
cout<<y<<" ";
}//将y值增加为原来的2倍
int initlist(sqlist &L)
{
L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L.elem)
return ERROR;
else
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}//构造一个空的线性表L
int destroylist(sqlist &L)
{
free(L.elem);
return OK;
}//销毁线性表L
int clearlist(sqlist &L)
{
L.length=0;
return OK;
}//将L重置为空表
int listempty(sqlist L)
{
if (0==L.length)
return TRUE;
else
return FALSE;
}//求当前表L是否为空
int listlength(sqlist L)
{
return L.length;
}//求当前线性表L的长度
int getelem(sqlist L,int i,int &e)
{
if(i<1||i>L.length)
exit(ERROR);
e=*(L.elem+i-1);
return OK;
}//用e返回L中第i个数据元素的值
int locateelem(sqlist L,int e,int(*compare)(int x1,int x2))
{
int i=1,j=0,*p;
p=L.elem;
while(i<=L.length&&!j)
{
j=compare(*p++,e);
++i;
}
if(i<=L.length)
return i-1;
else
return FALSE;
}//求L中第一个与e满足关系compare()的数据元素的位序,若不存在则返回0
int priorelem(sqlist L,int cur_e,int &pre_e)
{
int i=2,*p;
p=L.elem+1;
while(i<=L.length&&(*p++)!=cur_e)
i++;
if (i>L.length)
return FALSE;
else
{
pre_e=*p-2;
return OK;
}
}//若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义
int nextelem(sqlist L,int cur_e,int &next_e)
{
int i=1,*p;
p=L.elem;
while(i<L.length&&(*p++)!=cur_e)
i++;
if (i>=L.length)
return FALSE;
else
{
next_e=*p;
return OK;
}
}//若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义
int listinsert(sqlist &L,int i,int e)
{
int *newbase,*p,*q;
if((i<1)||(i>L.length+1))
return ERROR;
if (L.length>=L.listsize)
{
newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)
{
exit(0);
}
L.elem=newbase;
L.listsize=L.listsize+LISTINCREMENT;
}
q=L.elem+i-1;
for(p=L.elem+L.length-1;p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}//在线性表L中第i个位置插入元素e
int listdelete(sqlist &L,int i,int &e)
{
int *p,*q;
if(i<1||i>L.length)
return ERROR;
else
{
p=L.elem+i-1;
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)
{
*(p-1)=*p;
}
L.length--;
return OK;
}
}//将线性表中的第i个元素删除并返回其值
int listtraverse(sqlist L,void(*visit)(int &p))
{
int i=1,*p;
p=L.elem;
while(i<=L.length)
{
visit(*p);
p++;
i++;
}
return OK;
}//依次对L中的每一个元素调用函数visit(),一旦visit()失败,则操作失败
void main()
{sqlist L;
int i,j,k,b,n,e,m,a,cur_e,pre_e,next_e;
initlist(L);
cout<<"初始化后的基值地址:"<<L.elem<<" L.length=:"<<L.length<<" L.listsize=:"<<L.listsize<<endl;
cout<<"新建一顺序表."<<endl;
cout<<"当前表是否为空表"<<listempty(L)<<endl;
cout<<"定义该线性表长度:"<<endl;
cin>>a;
cout<<"分别输入线性表的各个元素,按ENTER"<<endl;
for(k=1;k<=a;k++){
cin>>j;
i=listinsert(L,k,j);}
for(b=1;b<=10;b++)
cout<<L.elem[b-1]<<endl;
listlength(L);
cout<<"当前表长:"<<L.length<<endl;
cout<<"输入要取的数的位置n(n<=10)"<<endl;
cin>>n;
getelem(L,n,e);
cout<<L.elem[n-1]<<endl;
cout<<"与该数相等的的一个数的位序为:"<<locateelem(L,e,compare)<<endl;
cout<<"输入要取前驱的数的位置m(<=10)"<<endl;
cin>>m;
getelem(L,m,cur_e);
if(priorelem(L,cur_e,pre_e))
cout<<"cur_e的前驱为:"<<pre_e<<endl;
else
cout<<"该元素没前驱"<<endl;
nextelem(L,cur_e,next_e);
if(nextelem(L,cur_e,next_e))
cout<<"cur_e的后继为:"<<next_e<<endl;
else
cout<<"该元素没后继"<<endl;
cout<<"输入要删元素的位序m(<=10)"<<endl;
cin>>m;
listdelete(L,m,e);
cout<<"被删的元素为:"<<e<<endl;
cout<<"删除元素后表长为"<<L.length<<endl;
listtraverse(L,visit);
cout<<"置为空表"<<clearlist(L)<<endl;
cout<<"销毁线性表"<<destroylist(L)<<endl;
}
⑥ 在C语言中,如何构造一个空的顺序线性表,然后怎么用
#include<stdio.h>
#define MAXSIZE 100
struct List
{
int L[MAXSIZE];
int top;
};
int Init()//top指针初始化为0
{
int top;
top=0;
return top;
}
void Input(struct List *t,int p,int n)//输入n个数据
{
if(n==0||n>=MAXSIZE)printf("空队列\n");
else
for(p=0;p<n;p++)
scanf("%d",&t->L[p]);
}
void Output(struct List *s,int i,int m)//输出m(=n)个数据哈
{
if(m==0||m>=MAXSIZE)printf("无法输出\n");
else
for(i=0;i<m;i++)
printf("%d ",s->L[i]);
}
void main()
{
struct List r;
int n,m;
scanf("%d",&n);
m=Init();
Input(&r,m,n);
Output(&r,0,n);
}
⑦ C 语言编程 (顺序线性表)
#ifndef FUNS_H
#define FUNS_H
void error( char *, ... ); /* 输出错误信息,退出程序 */
void flush_stdin( void ); /* 清空“输入缓冲区” */
#endif
#ifndef SQLIST_H
#define SQLIST_H
#define INITSIZE 100 /* 顺序表初始空间分配量 */
#define INCREMENT 10 /* 顺序表空间分配增量 */
typedef int ElemType; /* 声明ElemType代表的数据类型 */
/* 定义顺序表结构 */
typedef struct {
ElemType *elem; /* 存储空间基址 */
unsigned length; /* 当前长度 */
unsigned listsize; /* 当前空间分配量 */
} Sqlist;
/* 函数声明 */
int InitList(Sqlist *); /* 创建顺序表 */
int InputList(Sqlist *); /* 输入数据 */
int InsertList(Sqlist *, unsigned); /* 插入数据 */
void DelList(Sqlist *, unsigned, unsigned); /* 删除数据 */
int Union(Sqlist *, Sqlist *); /* 求顺序表并集 */
void Purge(Sqlist *); /* 删除表中重复元素 */
void Purge2(Sqlist *); /* 删除表中重复元素 */
void Bubble(Sqlist *, unsigned); /* 冒泡排序 */
int Compare(Sqlist *, Sqlist *); /* 比较两个顺序表的大小 */
void Exchange(Sqlist *, unsigned); /* 前N个元素和后M个元素互换 */
int Location(Sqlist *, ElemType); /* 求元素位置 */
void Disp(Sqlist *, unsigned); /* 显示顺序表信息 */
void Three(Sqlist *, unsigned, unsigned); /* 三次逆转法 */
#endif /* end of sqlist.h */
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include "../header/funs.h"
/* begin of error 05-8-15 18:40 */
void error( char *fmt, ... )
{ /* 输出错误信息,退出程序 */
va_list args;
va_start( args, fmt );
fprintf( stderr, "error: " );
vfprintf( stderr, fmt, args );
fprintf( stderr, "\n" );
va_end( args );
exit( -1 );
} /* end of error */
/* begin of flush_stdin 05-8-31 19:30 */
void flush_stdin( void ) /* 清空“输入缓冲区” */
{
int c;
if ( !feof(stdin) ) {
while( ( c=getchar() ) != '\n' && c != EOF )
;
}
} /* end of flush_stdin */
#include <stdio.h>
#include <stdlib.h>
#include "../header/sqlist.h"
/* begin of InitList 05-8-13 0:30 */
int InitList( Sqlist *L ) /* 创建顺序表 */
{
/* malloc 返回值为 void 类型,不需要显式转换 */
L->elem = malloc( INITSIZE * sizeof *L->elem ); /* 分配初始空间 */
if ( !L->elem ) {
return 0; /* 创建失败返回 0 */
}
/* 创建成功,初始化字符串长度和顺序表长度 */
L->length = 0;
L->listsize = INITSIZE;
return 1; /* 创建成功返回 1 */
} /* end of InitList */
/* begin of InputList 05-8-13 2:15 */
int InputList(Sqlist *L) /* 接受用户输入的字符串 */
{
unsigned i;
L->length = 0;
for ( i = 0; ( L->elem[i]=getchar() ) != '\n' && L->elem[i] != EOF ; ++i ) {
++L->length;
if ( L->length == L->listsize ) { /* 如果顺序表已满 */
ElemType *newbase = realloc( L->elem, /* 增加空间 */
( L->listsize + INCREMENT ) * sizeof *L->elem );
if ( newbase ) { /* 如果分配成功 */
L->elem = newbase; /* 将指针指向新分配好的空间 */
L->listsize += INCREMENT; /* 增大 listsize 的值 */
} else { /* 分配空间失败 */
return 0; /* 增加空间失败,返回 0 */
}
}
}
return 1;
} /* end of InputList */
/* begin of InsertList 05-8-13 5:00 */
int InsertList(Sqlist *L, unsigned pos) /* 插入数据 */
{
Sqlist tmp; /* 用于暂时存储用户输入的字符 */
long i;
if ( !InitList( &tmp ) ) {
return 0;
}
if ( InputList( &tmp ) ) {
if ( !tmp.length ) {
free(tmp.elem);
return 1;
}
if ( L->listsize - L->length < tmp.length ) {
ElemType *newbase = realloc( L->elem,
( L->listsize + tmp.length ) * sizeof *L->elem );
if ( newbase ) {
L->elem = newbase;
L->listsize += tmp.length;
} else {
free(tmp.elem);
return 0;
}
}
--pos;
/* 移动字符 */
for ( i = L->length - 1; i >= (long)pos; --i ) {
L->elem[i + tmp.length] = L->elem[i];
}
i = 0;
while ( i < (long)tmp.length ) {
L->elem[pos++] = tmp.elem[i++];
}
L->length += tmp.length; /* 更新字符串长度 */
free(tmp.elem);
return 1;
}
free(tmp.elem);
return 0;
} /* end of InsertList */
/* begin of DelList 05-8-13 12:00 */
void DelList(Sqlist *L, unsigned pos, unsigned size)
{
for ( --pos; pos + size < L->length; ++pos ) {
L->elem[pos] = L->elem[pos + size];
}
L->length -= size;
} /* end of DelList */
/* begin of Union 05-8-13 12:30 */
int Union(Sqlist *L1, Sqlist *L2){ /* 求顺序表并集 */
unsigned k;
/* 开始进行并集操作 */
if ( L1 == L2 ) { /* 如果 L1 和 L2 为同一顺序表 */
return 1;
}
for ( k = 0; k < L2->length; ++k ) {
/* 在顺序表 L1 中找不到顺序表 L2 中的第k+1个元素,将第k+1个元素插入顺序表 L1 */
if ( !Location( L1, L2->elem[k]) ) {
if ( L1->length == L1->listsize ) { /* 如果顺序表已满 */
ElemType *newbase = realloc( L1->elem, /* 增加空间 */
( L1->listsize + INCREMENT ) * sizeof *L1->elem );
if ( newbase ) {
L1->elem = newbase;
L1->listsize += INCREMENT;
} else {
return 0; /* 增加空间失败,返回 */
}
}
L1->elem[ L1->length ] = L2->elem[k]; /* 插入到表 L1 */
L1->length++; /* 表 L1 长度增加 */
}
}
return 1; /* 无误返回 */
} /* end of Union */
/* begin of Purge 05-8-13 13:00 */
void Purge(Sqlist *L) /* 删除表中重复元素 */
{
unsigned i, j, k;
for ( i = 0; i < L->length; i++ ) {
for ( j = i+1; j < L->length; ) {
if ( L->elem[i] == L->elem[j] ) { /* 若找到重复元素 */
for ( k = j; k < L->length; k++ ) { /* 删除重复元素 */
L->elem[k] = L->elem[k+1];
}
L->length--; /* 顺序表长度减1 */
}
else {
j++;
}
}
}
} /* end of Purge */
/* begin of Purge2 05-8-13 13:20 */
void Purge2(Sqlist *L) /* 删除表中重复元素 */
{
Sqlist T = *L;
unsigned i;
T.length = 1;
for ( i = 1; i < L->length; i++ ) {
if ( !Location( &T, L->elem[i] ) ) { /* 若找不到重复元素 */
T.elem[T.length] = L->elem[i]; /* 插入 */
T.length++; /* 更新长度 */
}
}
L->length = T.length; /* 更新长度 */
} /* end of Purge2 */
/* begin of Bubble 05-8-13 14:10 */
void Bubble(Sqlist *L, unsigned ascend)
{
ElemType temp;
unsigned i, j, k = L->length - 1;
unsigned l;
if ( !L->length ) {
return;
}
for ( l = 1; l; k-- ) {
l = 0;
for ( i = 0, j = 1; i < k; i++, j++ ) {
/* 根据 ascend 的值进行升序或者降序排列 */
if ( ( L->elem[i] < L->elem[j] ) ^ ascend ) {
temp = L->elem[i];
L->elem[i] = L->elem[j];
L->elem[j] = temp;
l = 1;
}
}
}
} /* end of Bubble */
/* begin of Compare 05-8-13 14:40 */
int Compare(Sqlist *L1, Sqlist *L2) /* 比较两个顺序表 */
{
unsigned k;
if ( L1 == L2 ) {
return 0;
}
for ( k = 0; k < L1->length && k < L2->length; k++ ) {
if ( L1->elem[k] > L2->elem[k] ) {
return 1;
}
if ( L1->elem[k] < L2->elem[k] ) {
return -1;
}
}
return L1->length - L2->length;
} /* end of Compare */
/* begin of Exchange 05-8-13 15:10 */
void Exchange(Sqlist *L, unsigned i) /* 前N个元素和后M个元素互换 */
{
/* 三次逆转 */
Three( L, 0, i-1 );
Three( L, i, L->length-1 );
Three( L, 0, L->length-1 );
} /* end of Exchange */
/* begin of Three 05-8-13 14:55 */
void Three(Sqlist *L, unsigned i, unsigned j) /* 三次逆转法 */
{
ElemType temp;
for (; i < j; i++, j-- ) {
temp = L->elem[i];
L->elem[i] = L->elem[j];
L->elem[j] = temp;
}
} /* end of Three */
/* begin of Location 05-8-13 12:10 */
int Location(Sqlist *L, ElemType elem) /* 求元素位置 */
{
unsigned l;
for ( l=0; l < L->length && L->elem[l] != elem; l++ ) {
;
}
if ( l == L->length ) { /* 在顺序表中找不到elem */
return 0; /* 返回0 */
}
return ++l; /* 找到则返回元素位置 */
} /* end of Location */
/* begin of Disp 05-8-13 15:20 */
void Disp( Sqlist *L, unsigned total_lists ) /* 显示顺序表信息 */
{
unsigned short i;
unsigned j;
printf( "\n当前一共有 %u 个顺序表。每个表的数据如下:\n", total_lists );
for ( i = 0; i < total_lists; i++ ) {
printf( "\n顺序表 %d :", i+1 );
for ( j = 0; j < L[i].length; j++ ) {
printf( "%c", L[i].elem[j] );
}
printf( "\n字符串长度:%u 顺序表长度:%u\n", L[i].length, L[i].listsize);
}
} /* end of Disp */
#include <stdio.h>
#include <stdlib.h>
#include "header/sqlist.h"
#include "header/funs.h"
#define MAX_LISTS 10 /* 最多可以建立的顺序表个数 */
/* 函数声明 */
char Menu( void ); /* 打印菜单,请用户选择 */
unsigned Choose( unsigned, unsigned, char ); /* 接收用户输入的选择 */
static int tmp; /* tmp 用于清空输入缓冲区 */
const char *msg[] = { "\n请问您要对哪个顺序表(%u — %u)进行操作:",
"\n请输入删除数目(%u — %u):",
"\n请输入字符串(原有数据会被覆盖):",
"\n请输入插入位置(%u — %u):",
"\n请输入删除位置(%u — %u):",
"\n此项操作至少要有两个顺序表才能进行。请再建立一个顺序表。",
"\n重复元素已被删除。",
"\n请问您要进行降序排序还是升序排序(%u 代表降序,%u 代表升序):",
"\n顺序表 %u %c 顺序表 %u",
"\n请输如互换点(%u — %u):",
"\n排序完成。" };
int main( void )
{
Sqlist L[ MAX_LISTS ]; /* 顺序表数组 */
char choice; /* 记录用户选择的操作 */
unsigned short total_lists = 0; /* 用于记录目前一共有多少个顺序表 */
char *init_msg[] = { "内存不足!创建失败。", /* 创建顺序表的提示信息 */
"顺序表创建成功!您可以开始对顺序表进行操作了。" };
printf( "\n请先创建一个顺序表。最多可以创建 %u 个顺序表。\n", MAX_LISTS );
while ( choice = Menu() ) { /* 根据用户输入选择函数运行 */
if ( !total_lists && choice != 1 ) {
printf( "\n请先创建一个顺序表。最多可以创建 %u 个顺序表。\n", MAX_LISTS );
} else {
switch ( choice ) {
case 1 :
if ( total_lists == MAX_LISTS ) { /* 达到最大限制 */
printf( "\n最多只能建立 %u 个顺序表。\n", MAX_LISTS );
} else {
int i = InitList( &L[total_lists] );
total_lists += i; /* 更新顺序表数目 */
printf( "\n%s\n", init_msg[i] );
}
break;
case 2 :
{
unsigned num = Choose( total_lists, 1, 0 );
printf( "%s", msg[choice] );
InputList(&L[num-1]);
break;
}
case 3 :
{
unsigned num, pos;
num = Choose( total_lists, 1, 0 );
pos = Choose( L[num-1].length + 1, 1, choice );
printf( "\n请输入字符串:" );
/* 在第 num 个顺序表的第 pos 个元素处开始插入 */
InsertList( &L[num-1], pos );
break;
}
case 4 :
{
unsigned num, pos, size;
num = Choose( total_lists, 1, 0 );
if ( !L[num-1].length ) {
printf( "\n顺序表为空,不能进行删除操作。\n" );
break;
}
pos = Choose( L[num-1].length, 1, choice );
size = Choose( L[num-1].length - pos + 1, 1, 1 );
/* 从第 num 个顺序表的第 pos 个位置开始,删除 size 个元素 */
DelList( &L[num-1], pos, size );
break;
}
case 5 :
{
unsigned num1, num2;
if ( total_lists < 2 ) {
puts( msg[choice] );
break;
}
num1 = Choose( total_lists, 1, 0 );
num2 = Choose( total_lists, 1, 0 );
if ( Union( &L[num1-1], &L[num2-1] ) ) {
printf( "\n并集操作完成。操作结果保存于顺序表 %u 。\n", num1 );
} else {
printf( "\n并集操作失败。\n" );
}
break;
}
case 6 :
{
unsigned num = Choose( total_lists, 1, 0 );
Purge( &L[num-1] );
puts( msg[choice] );
break;
}
case 7 :
{
unsigned num = Choose( total_lists, 1, 0 );
unsigned ascend = Choose( 1, 0, choice );
Bubble( &L[num - 1], ascend );
puts( msg[10] );
break;
}
case 8 :
{
unsigned num1, num2;
int flag;
if ( total_lists < 2 ) {
puts( msg[5] );
break;
}
num1 = Choose( total_lists, 1, 0 );
num2 = Choose( total_lists, 1, 0 );
flag = Compare( &L[num1-1], &L[num2-1] );
if ( !flag ) {
flag = '=';
} else if ( flag > 0 ) {
flag = '>';
} else {
flag = '<';
}
printf( msg[choice], num1, flag, num2 );
break;
}
case 9 :
{
unsigned num = Choose( total_lists, 1, 0 ), point;
if ( L[num-1].length < 2 ) {
puts("\n元素太少,不能进行互换。");
break;
}
point = Choose( L[num-1].length - 1, 1, choice );
Exchange( &L[num-1], point );
puts( "\n互换完成。" );
break;
}
case 10 :
{
unsigned num = Choose( total_lists, 1, 0 );
Purge2( &L[num-1] );
puts( msg[6] );
break;
}
break;
default:
break;
}
}
/* 打印顺序表的内容 */
Disp( L, total_lists );
}
while ( total_lists ) {
free( L[ --total_lists ].elem ); /* 释放内存 */
}
puts( "\n感谢您使用我们的产品!请按回车退出..." );
getchar();
return 0; /* 退出程序 */
} /* end of main */
/* begin of Choose 05-8-13 3:00 */
unsigned Choose( unsigned up, unsigned low, char c )
{
unsigned num = 0;
do {
printf( msg[c], low, up );
scanf( "%u", &num );
flush_stdin(); /* 清空输入缓冲区 */
} while ( num > up || num < low );
return num;
} /* end of Choose */
/* begin of Menu 05-8-12 23:20 */
char Menu( void ) /* 打印菜单,并且接受用户输入 */
{
int ch = -1; /* ch 用于接收用户输入 */
for (;;) {
printf( "\n********************************\n"
"* 1. 创建顺序表 *\n"
"* 2. 输入数据 *\n"
"* 3. 插入数据 *\n"
"* 4. 删除数据 *\n"
"* 5. 求顺序表并集 *\n"
"* 6. 删除重复元素 *\n"
"* 7. 冒泡排序 *\n"
"* 8. 比较顺序表大小 *\n"
"* 9. 前N个元素和后M个元素互换 *\n"
"*10. 删除重复元素(2) *\n"
"* 0. 退出 *\n"
"********************************\n\n"
"请输入您要执行的操作(按回车确定):");
scanf( "%d", &ch );
flush_stdin(); /* 清空输入缓冲区 */
if ( ch < 11 && ch > -1 ) {
break; /* 输入合法,退出循环 */
}
/* 非法输入,请用户重新输入 */
puts("\n请输入 0 到 10 之间的数字。\n");
} /* end of for */
return ch; /* 返回操作号 */
} /* end of Menu */
给你的邮箱,发,,网络难编辑
已经发到你的邮箱了,请注意查收.
⑧ C语言线性表顺序存储
建链表的函数用引用就好了
#include"stdafx.h"
#include<stdio.h>
#include<stdlib.h>
//-------------------
#defineMAXSIZE100//Thelargestnumberofpeople
typedefintElemType;
typedefstruct
{
ElemTypedata[MAXSIZE];
ElemTypepassward[MAXSIZE];
intlength;
}seqList;
seqList*L;
voidCreaList(seqList*&L,int[MAXSIZE],intn);/////引用
voidPrintList(seqList*L,intn);//不一致
intmain(void)
{
intn=0,m=0;
inta[MAXSIZE];
do
{
if(n>MAXSIZE)
{
printf("Thenumberofpeopletoomuch,pleaseinputagain! ");
}
printf("Pleaseenterthenumberofpeople(upto%d):",MAXSIZE);
scanf_s("%d",&n);
}while(n>MAXSIZE);
printf("Pleaseentertheinitailpassword:");
scanf_s("%d",&m);
CreaList(L,a,n);
printf("--------printthelineartable-------- ");
PrintList(L,n);
printf("初始化成功... ");
system("pause");
}
voidCreaList(seqList*&L,inta[MAXSIZE],intn)/////引用
{
intiPassword;
L=(seqList*)malloc(sizeof(seqList));
for(inti=1;i<=n;i++)
{
L->data[i]=a[i];
printf("Pleaseenterthe%dpersonalpassword:",i);
scanf_s("%d",&iPassword);
L->passward[i]=iPassword;
}
L->length=n;
}
voidPrintList(seqList*L,intn)
{
for(inti=1;i<=n;i++)
{
printf("--------ID---------PASSWORD-------- ");
printf("%6d%5d ",L->data[i],L->passward[i]);
}
}
⑨ C语言实现顺序线性表的问题
if(L->length>>=L->listsize)应该是if(L->length +1 > L->listsize)
Status ListInsert_Sq(SqList *L,int i,ElemType e),
ElemType e是形参,在函数执行完成后,e在栈中已释放,所以链表中保存的是一个非法地址,会出内存错误。链表中保存的应该是元素的地址,而不是保存元素值。
*q=e;/*插入e*/,这里也是错误用法.
⑩ C语言 顺序线性表 实现学生成绩管理系统
楼主要问什么问题啊