实验1:
#include<stdio.h> //线性表:顺序存储结构
#include<string.h>
#define MAXSIZE 9
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct Sqlist{
ElemType data[MAXSIZE];
int length;
Sqlist(){
length=0;
}
}Sqlist;
Status ListShow(Sqlist &L);
/* 重置为空表——清空*/
Status ListClear(Sqlist &L){
memset(L.data,0,sizeof(L.data));
L.length=0;
return OK;
}
/* 获取某个下标的元素的值——查询*/
Status GetElem(const Sqlist &L,const int &i,ElemType &e){
if(L.length==0||i<1||i>L.length){
printf("询问时:下标 %d,不合法。\n",i);
return ERROR;
}
e=L.data[i-1];
return OK;
}
/* 指定某个位置插入某元素——插入*/
Status ListInsert(Sqlist &L,int i,ElemType e){
int k,len=L.length,temp;
if(len>=MAXSIZE){
printf("错误提醒:线性表已满\n\n");
return ERROR;
}else if(i<1||i>len+1){
printf("错误提醒:所插入的位置%d ,位置不合法\n\n",i);
return ERROR;
}else if(i<=len){
for(k=len-1;k>=i-1;k--){
L.data[k+1]=L.data[k];
}
}
L.data[i-1]=e;
L.length++;
printf("下标为:%d , 元素为:%d ,插入元素成功\n\n",i,e);
/*检查每个位置元素*/
ListShow(L);
printf("\n");
return TRUE;
}
/*删除指定下标的某个元素*/
Status ListDelete(Sqlist &L,int i,ElemType &e){
int k;
if(L.length==0){
printf("线性表为空\n");
return ERROR;
}
if(i<1||i>L.length){
printf("错误提示:删除的下标:%d\n",i);
return ERROR;
}
e=L.data[i-1];
if(i<L.length){
for(k=i;k<=L.length;k++){
L.data[k-1]=L.data[k];
}
}
printf("删除成功,删除元素下标为:%d . 删除元素为:%d\n",i,e);
L.length--;
return OK;
}
Status ListShow(Sqlist &L){
int temp;
if(L.length==0){
printf("访问的线性表为空\n");
return ERROR;
}
for(int i=1;i<=L.length;i++){
GetElem(L,i,temp);
printf("%d%c",temp,i==L.length?'\n':' ');
}
printf("\n");
return OK;
}
int main()
{
Sqlist L;
int a[]={1,2,3,4,5,6,7},ans,temp;
memcpy(L.data,a,sizeof(a));
L.length=7;
//历遍
ListShow(L);
//询问
GetElem(L,3,temp);
printf("询问:下标为%d, 大小:%d\n",3,temp);
//删除
ListDelete(L,3,temp);
ListShow(L);
//插入
ListInsert(L,3,3);
return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType ;
typedef struct Node {
ElemType data;
struct Node *next;
}Node;
typedef struct Node * LinkList;
/*
询问环节,通过历遍整个链表来找到对应下标的元素。
注意抛出不合法情况。
*/
Status GetElem(LinkList head,int i,ElemType &e)
{
int j=1;
LinkList p;
p=head->next;
while(p&&j<i){
p=p->next;
j++;
}
if(!p||i<j){
if(!p){
printf("错误提示:所给下标的值:%d ,比链表长度:%d要长",i,j);
}else if(i<j){
printf("错误提示:所给下标的值:%d不合法",i);
}
return ERROR;
}
e=p->data;
printf("询问成功!!!\n");
return OK;
}
/*
插入环节:找到对应的下标,插入元素。
注意要抛出不合法的情况。
*/
Status ListInsert(LinkList *head,int i,ElemType e){
int j=1;
LinkList p=*head;
while(p&&j<i){
p=p->next;
j++;
}
if(!p||i<j){
if(!p){
printf("错误提示:所给下标的值:%d ,比链表长度:%d要长",i,j);
}else if(i<j){
printf("错误提示:所给下标的值:%d不合法",i);
}
return ERROR;
}
LinkList s=(LinkList)(malloc(sizeof(Node)));
s->data=e;
s->next=p->next;
p->next=s;
printf("插入成功!!!\n");
return OK;
}
Status ListDelete(LinkList &L,int i,ElemType &e){
int j=0;
LinkList p=L;
while( (p->next)&&(j<i-1) ){
p=p->next;
j++;
}
if( (!p) || (j>i-1) ){
printf("删除失败!!!\n所删除的下标为:%d\n",i);
return ERROR;
}
LinkList q=p->next;
p->next=q->next;
e=q->data;
free(q);
printf("删除:下标:%d 元素:%d\n",i,e);
return OK;
}
Status ListShow(LinkList &L){
LinkList p=L->next;
if(!(p->next)){
printf("所在的链式线性表为空\n");
return ERROR;
}
while(p->next){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return OK;
}
int main()
{
int e;
LinkList head =(LinkList)malloc(sizeof(Node));
LinkList s1=(LinkList)malloc(sizeof(Node));
s1->data=4;
s1->next=NULL;
head->next=s1;
ListInsert(&head,1,2);
ListInsert(&head,2,3);
ListInsert(&head,2,7);
ListInsert(&head,3,5);
GetElem(head,3,e);
printf("询问:下标:%d 元素:%d\n",3,e);
ListDelete(head,2,e);
return 0;
}