順序線性表的插入,刪除操作(完整程式碼)
阿新 • • 發佈:2019-01-06
1..插入 :在順序線性表l的第i個位置前插入元素e 。
第一步判斷插入位置是否合法,如果不合法則異常退出。第二步判斷線性表儲存空間是否不足,如果不足則增加儲存容量。第三步將插入位置及之後元素後移。第四步將待插入元素插入。
2..刪除:從順序線性表l中刪除第i個元素,並用e返回其值 。
第一步判斷刪除位置是否合法,如果不合法則異常退出。第二步將待刪除位置元素的值賦於e。第三步將被刪除之後的元素左移 。
程式碼實現:
//插入,刪除操作 #include<stdio.h> #include <stdlib.h> //定義雜項函式及記憶體分配函式 #include<iostream> using namespace std; typedef int elemtype;//將int起別名為 elemtype //線性表的動態分配順序儲存結構 #define LIST_INIT_SIZE 100 //線性表儲存空間的初始分配量 #define LISTINCREMENT 2 //線性表儲存空間的分配增量 typedef struct { elemtype *elem; //儲存空間基址 int length; //當前長度 int listsize; //當前分配的儲存容量 } sqlist; //插入操作 elemtype listinsert(sqlist &l,int i ,elemtype &e) { if(i<1||i>l.length+1) return 1; //i值不合法 if(l.length>=l.listsize)//當前儲存位置已滿,增加分配 {elemtype *newbase; newbase=(elemtype *)malloc((l.listsize+LISTINCREMENT)*sizeof(elemtype)); if(!newbase)//儲存分配失敗 { cout<<"儲存分配失敗"; exit(1);//儲存分配失敗 ,1為異常退出 } for(int j = 0 ; j < l.length ; j++) newbase[j] = l.elem[j];//給各元素賦值 l.elem=newbase;//首地址賦值 l.listsize+= LISTINCREMENT;//增加儲存容量,為一個elemtype型元素所佔記憶體 } //newbase=(elemtype *)realloc(l.elem,((l.listsize+LISTINCREMENT)*sizeof(elemtype))); elemtype *q,*p; q = &(l.elem[i-1]);//q為插入地址 for(p=&(l.elem[l.length-1]);p>=q;p--)//插入位置及之後的元素後移一個位置 *(p+1)=*p; *q=e;//插入e l.length++;//表長增加1 cout<<"插入元素後:"; for(int i = 0 ; i < l.length ; i++) cout<<l.elem[i]<<" "; cout<<endl; return 0; } //刪除操作。從順序線性表l中刪除第i個元素,並用e返回其值 elemtype listdelete(sqlist &l,int i,elemtype *e) { if(i<1||i>l.length+1) return 1; //i值不合法 int *p,*q; p=&(l.elem[i]);//p為刪除元素地址 e=p; cout<<"被刪除值的值為:"<<*e<<endl; q=l.elem+l.length-1;//表尾元素位置 for(p++;p<=q;p++)//被刪除之後的元素左移 注意初始值為p++ *(p-1)=*p; l.length--;//表長減1 cout<<"刪除元素後:"; for(int i=0;i<l.length;i++) cout<<l.elem[i]<<" "; cout<<endl; return 0; } int main() { sqlist l; elemtype b[]={1,4,5,6}; l.elem=b; l.length=sizeof(b)/sizeof(elemtype); l.listsize=sizeof(elemtype)*l.listsize; elemtype e,d; e = 9;//待插入元素的值 cout<<"原序列:" ; for(int i=0;i<l.length;i++) cout<<l.elem[i]<<" "; cout<<endl; listinsert(l,2,e); listdelete(l,3,&d); } //int *p; //p=&(l.elem[i]); // //與int *p=&(l.elem[i]);含義相同
執行結果: