线性表之顺序表
线性表的顺序存储是指,在内存中用地址连续的一块存储空间,顺序存放线性表的各元素,用这种存储形式存储的线性表成为顺序表。
顺序表的基本操作
1. 顺序表的结构定义
首先我们来定义顺序表
typedef struct LNode{ int data[MAX]; int Length; }SeqList; int arr[]={1,5,6,3,9,7};/* 定义一个要输入的数组 */
2. 初始化顺序表
SeqList *ListCreat(){ SeqList *L; L=(SeqList *)malloc(sizeof(SeqList)); for (int i = 0; i < sizeof(arr)/4; i++){ /* 向data填入arr中的数据 */ L->data[i] = arr[i]; } L->Length=sizeof(arr)/4; return L; }
3. 插入运算
线性表的插入是指在第i个位置插入元素x,插入后使原表长n变为n+1,顺序表上插入运算主要步骤如下:
将ai~an的元素顺序向后移动,将x放到空出的第i个位置,修改表长
int ListInsert(SeqList *L, int pos, int ele){ if(pos>L->Length+1 || pos<1){ printf("位置错"); return -1; /* 检查插入位置正确性 */ } if(L->Length == MAX){ /* 表满 */ printf("表满"); return 0; } for (int i = L->Length-1; i > pos-2; i--){ L->data[i+1]=L->data[i]; /* 节点移动 */ } L->data[pos-1] = ele; /* 新元素插入 */ L->Length++; /* 表长+1 */ return 1; /* 插入成功返回1 */ }
时间复杂度O(n),n/2。
4. 删除元素
删除运算的主要步骤为:将ai+1~an顺序向前移动, 修改表长。
int ListDel(SeqList *L,int pos){ if(pos>L->Length || pos<1){ /* 检查删除位置合法性 */ printf("无法删除第%d个元素",pos); return 0; } for(int i=pos-1; i < L->Length; i++){ L->data[i]=L->data[i+1]; /* 移动元素 */ } L->Length--; /* 修改表长 */ return 1; /* 删除成功 */ }
时间复杂度O(n),(n+1)/2
5. 查找元素
在顺序表中查找元素时,从第一个元素开始依次与元素x比较,直到与找到一个与x相等的数据元素,返回他在顺序表中的存储下标,如果没有找到,则返回-1。
int ListSerach(SeqList *L,int x){ int i=0; while (i<L->Length && L->data[i]!=x){ i++; } if (i>L->Length-1) return -1; /* 查找失败,返回-1 */ else return i; /* 查找成功返回所在位置 */ }
时间复杂度:O(n),(n+1)/2。
完整代码:
#include "stdio.h" #include <stdlib.h> #define MAX 20 typedef struct LNode{ int data[MAX]; int Length; }SeqList; int arr[]={1,5,6,3,9,7};/* 定义一个要输入的数组 */ /* 初始化顺序表 */ SeqList *ListCreat(){ SeqList *L; L=(SeqList *)malloc(sizeof(SeqList)); for (int i = 0; i < sizeof(arr)/4; i++){ /* 向data填入arr中的数据 */ L->data[i] = arr[i]; } L->Length=sizeof(arr)/4; return L; } /* 插入元素 */ int ListInsert(SeqList *L, int pos, int ele){ if(pos>L->Length+1 || pos<1){ printf("位置错"); return -1; /* 检查插入位置正确性 */ } if(L->Length == MAX){ /* 表满 */ printf("表满"); return 0; } for (int i = L->Length-1; i > pos-2; i--){ L->data[i+1]=L->data[i]; /* 节点移动 */ } L->data[pos-1] = ele; /* 新元素插入 */ L->Length++; /* 表长+1 */ return 1; /* 插入成功返回1 */ } /* 删除指定位置元素 */ int ListDel(SeqList *L,int pos){ if(pos>L->Length || pos<1){ /* 检查删除位置合法性 */ printf("无法删除第%d个元素",pos); return 0; } for(int i=pos-1; i < L->Length; i++){ L->data[i]=L->data[i+1]; /* 移动元素 */ } L->Length--; /* 修改表长 */ return 1; /* 删除成功 */ } /* 查找元素 */ int ListSerach(SeqList *L,int x){ int i=0; while (i<L->Length && L->data[i]!=x){ i++; } if (i>L->Length-1) return -1; /* 查找失败,返回-1 */ else return i; /* 查找成功返回所在位置 */ } /* 显示链表 */ void displayList(SeqList *L){ printf("\nL的内容:"); for (int i = 0; i < L->Length; i++) { printf("%d ",L->data[i]); } printf("\n"); } int main(){ int i,e; SeqList *L = ListCreat(); displayList(L); printf("请输入插入的位置:"); scanf("%d",&i); printf("请输入插入的数据:"); scanf("%d",&e); ListInsert(L,i,e); displayList(L); printf("要查找的元素"); scanf("%d",&e); i = ListSerach(L,e)+1; printf("元素%d的位置是%d\n",e,i); printf("请输入删除的位置:"); scanf("%d",&i); ListDel(L,i); displayList(L); }

浙公网安备 33010602011771号