1. 程式人生 > >順序線性表的插入,刪除操作(完整程式碼)

順序線性表的插入,刪除操作(完整程式碼)

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]);含義相同 
  	

執行結果: