#include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 #define LISTINCREAMENT 10

typedef int ElemType; typedef int Status;

typedef struct { ElemType *elem; //线性表占用的数组空间 int length; //线性表的长度 int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位) }SqList;

//线性表初始化 Status InitList_Sq(SqList *L){
//构造一个空的线性表 L->elem=(ElemType )malloc(LIST_INIT_SIZEsizeof(ElemType)); if (!L->elem) exit(OVERFLOW); //存储分配失败 L->length=0; //空表长度为0 L->listsize= LIST_INIT_SIZE; //初始存储容量 return OK; }

//求线性表长度 Status ListLength(SqList *L){ return L->length; }

//插入元素,C语言数组从第0个元素开始,此处下标从1开始 Status ListInsert(SqList *L, int i, ElemType e) { // 在顺序表L的第 i 个元素之前插入新的元素e, // i 的合法范围为 1≤i≤L->length+1 ElemType *p,*q,newbase; if (i<1 || i>L->length+1) return ERROR; // 插入位置不合法 if (L->length+1 >= L-> listsize) { newbase=(ElemType)realloc(L->elem++,(LIST_INIT_SIZE+LISTINCREAMENT)*sizeof(ElemType)); if(!newbase) return OVERFLOW;// 当前存储空间已满 L-> elem=newbase; L-> listsize+=LISTINCREAMENT; } // i的范围合法,则在顺序表L的第 i 个元素之前插入新的元素e, p = &(L->elem[i-1]); // p为插入位置的前一个位置 q = &(L->elem[L->length-1]); // q为表尾元素的位置 for (; q >= p; --q) *(q+1) = *q; // 插入位置之后的元素右移 *p = e; // 插入元素e到插入位置 ++L->length; return OK; }

//删除元素 Status ListDelete(SqList *L, int i, ElemType *e){
ElemType *p,*q; // 在顺序线性表L中删除第i个元素,并用e返回其值。 // i的合法值为1≤i≤ListLength(L) // 删除位置不合法 if ((i < 1) || (i > L->length)) return ERROR; // 若删除位置合法,则删除该位置元素 p = &(L->elem[i-1]); // p为被删除元素的位置 *e = *p; // 被删除元素的值赋给e q = &(L->elem[L->length-1]); // 表尾元素的位置 for (++p; p <= q; ++p) *(p-1) = *p; // 被删除元素之后的元素左移 --L->length; return OK; }

//获取某个位置的元素值 Status GetItem(SqList *L,int i,ElemType *e){ if ((i < 1) || (i > L->length)) return ERROR; *e = L->elem[i-1]; return OK; }

Status DestroyList(SqList *L){ free(L->elem); free(L); return OK; }

//主函数 int main(){ SqList *L; ElemType x,e; int i,n,choice,position,flag; L=(SqList *)malloc(sizeof(SqList)); InitList_Sq(L); // 插入5个结点,值为1 2 3 4 5 for(i=1;i<=5;i++){
ListInsert(L, i,i); } printf('请输入你要插入结点的位置:'); scanf('%d',&position); printf('请输入你要插入的数据:'); scanf('%d',&x); flag = ListInsert(L, position,x); if(flag) printf('插入成功,插入的元素值为%d\n',x); else printf('元素插入失败,请重试!\n'); printf('顺序表的元素为:'); for(i=1;i<= ListLength(L);i++) printf('%d\t',L->elem[i-1]); DestroyList(L); return 0; }

C语言线性表顺序存储结构实现 - 在第i个位置之前插入元素

原文地址: https://www.cveoy.top/t/topic/dUe1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录