c語言順序表的基本操作
下面是順序表的基本操作,c語言版的數據結構書上寫的操作都實現了
因為總體代碼太長如果寫在一個class中要近500行,閱讀和修改都不方便,所以採用分開寫,希望大家以後寫較長的程序時也採用這種方法,自己運行的所有功能都能實現,而且個人感覺界面還是比較人性化的,大家還有什麼意見或者程序有什麼問題都可以在評論區提出,我會及時修改的。
[cpp] view plain copy
seqlist.h
#ifndef SEQLIST_H
#define SEQLIST_H
#include <stdio.h>
#include <malloc.h>
#define SEQLISR_INIT_SIZE 5
#define INC_SIZE 3
typedef int ElemType;
typedef struct Seqlist
{
ElemType *base;//指針域
int capacity;//順序表容量
int size;//表的大小
}Seqlist;
void create_list(Seqlist *list);//順序表元素的輸入
bool Inc(Seqlist *list);//增加順序表的容量
void InitSeqlist(Seqlist *list);//初始化順序表
void push_back(Seqlist *list,ElemType x);//在順序表的末尾插入元素
void push_front(Seqlist *list,ElemType x);//在順序表的頭部插入元素
void show_list(Seqlist *list);//顯示順序表的元素
void pop_back(Seqlist *list);//刪除順序表的最後一個元素
void pop_front(Seqlist *list);//刪除順序表的第一個元素
void insert_pos(Seqlist *list,int pos,ElemType x);//在順序表的指定位置插入數據
int find(Seqlist *list,ElemType key);//查找元素key的下標
int length(Seqlist *list);//求順序表的長度
void delete_pos(Seqlist *list,int pos);//刪除順序表中指定位置的數據
void delete_val(Seqlist *list,int key);//刪除順序表中值為key的元素
void sort(Seqlist *list);//冒泡排序
void reverse(Seqlist *list);//逆置順序表
void clear(Seqlist *list);//清除順序表中的所有元素
void destroy(Seqlist *list);//摧毀順序表
void merge(Seqlist *lt,Seqlist *la,Seqlist *lb);//吧兩個表合為一個表
#endif // SEQLIST_H
seqlist.cpp
#include "seqlist.h"
void InitSeqlist(Seqlist *list)//初始化順序表,創建一個名字為List的線性表,list通過結構體定義
{
list->base=(ElemType*)malloc(sizeof(ElemType)*SEQLISR_INIT_SIZE);//對錶list分配空間
if(!list->base)
exit(-1);
list->capacity=SEQLISR_INIT_SIZE;//順序表的容量
list->size=0;//順序表的大小/長度,表示當前順序表中無任何內容
}
bool Inc(Seqlist *list)//增加順序表的容量
{
ElemType *newbase=(ElemType*)realloc(list,sizeof(ElemType)*(list->capacity+INC_SIZE));//重新分配內存空間,增減INC個容量
if(newbase==NULL)
printf("內存分配失敗!");
list->base=newbase;
list->capacity+=INC_SIZE;
}
void create_list(Seqlist *list)
{
int i,x;
printf("請確定輸入元素的個數:");
scanf("%d",&i);
printf("請輸入元素
");
for(int j=0; j<i; j++)
{
scanf("%d",&x);
list->base[j]=x;
}
list->size=i;
}
void push_back(Seqlist *list,ElemType x)//在順序表的尾部插入元素
{
if(list->size>=list->capacity&&!Inc(list))
{
printf("順序表已滿,無法在尾部插入新元素");
return;
}
list->base[list->size]=x;
list->size++;
}
void push_front(Seqlist *list,ElemType x)//在順序表頭部插入新元素
{
if(list->size>=list->capacity&&!Inc(list))
{
printf("順序表已滿,無法在尾部插入新元素");
return;
}
for(int i=list->size; i>0; i--)
{
list->base[i]=list->base[i-1];
}
list->base[0]=x;
list->size++;
}
void show_list(Seqlist *list)//順序表的列印輸出
{
for(int i=0; i<list->size; i++)
{
printf("%d
",list->base[i]);
}
}
void pop_front(Seqlist *list)//刪除表頭元素
{
if(list->size==0)
{
printf("順序表為空,無法刪除元素");
return;
}
for(int i=0; i<list->size-1; i++)
{
list->base[i]=list->base[i+1];
}
list->size--;
}
void pop_back(Seqlist *list)//刪除最後一個元素
{
if(list->size==0)
{
printf("順序表為空,無法刪除元素");
return;
}
list->size--;//這也太聰明了,直接減少一個元素
}
int length(Seqlist *list)
{
return list->size;
}
void insert_pos(Seqlist *list,int pos,ElemType x)//在指定位置插入元素
{
if(pos<0||pos>list->size)
{
printf("插入位置不合法,無法插入元素");
return;
}
if(list)
for(int i=list->size; i>pos; i--)
{
list->base[i]=list->base[i-1];
}
list->base[pos]=x;
list->size++;
}
int find(Seqlist *list,ElemType key)//尋找key的位置
{
for(int i=0; i<list->size; i++)
{
if(list->base[i]==key)
return i;
}
return -1;
}
void delete_pos(Seqlist *list,int pos)//刪除指定位置的元素
{
if(pos<0||pos>=list->size)
{
printf("刪除位置不合法");
return;
}
for(int i=pos; i<list->size-1; i++)
{
list->base[i]=list->base[i+1];
}
list->base--;
}
void delete_val(Seqlist *list,int key)//刪除指定元素
{
int pos=find(list,key);
if(pos==-1)
{
printf("順序表中沒有這個元素");
return;
}
delete_pos(list,pos);
}
void sort(Seqlist *list)
{
for (int i = 0; i < list->size - 1; i++) //排序的趟數(例如5個數據需要比較4趟)
{
for (int j = 0; j < list->size - 1 - i; j++) //每一趟比較中的比較次數(例如5個數據在第0趟需要比較4次)
{
if (list->base[j] > list->base[j + 1])
{
ElemType temp = list->base[j];
list->base[j] = list->base[j + 1];
list->base[j + 1] = temp;
}
}
}
}
void reverse(Seqlist *list)//將順序表倒置
{
if(list->size==0||list->size==1)
return;
int low=0,high=list->size-1;
while(low<high)
{
ElemType temp=list->base[low];
list->base[low]=list->base[high];
list->base[high]=temp;
low++;
high--;
}
}
void clear(Seqlist *list)
{
list->size=0;
}
void destroy(Seqlist *list)//摧毀順序表
{
free(list->base);
list->base=NULL;
list->capacity=0;
list->size=0;
}
void merge(Seqlist *lt,Seqlist *la,Seqlist *lb)//把兩個順序表合併為一個
{
lt->capacity=la->size+lb->size;
lt->base=(ElemType*)malloc(sizeof(ElemType)*lt->capacity);
if(!lb->base)
exit(-1);
int ia=0,ib=0,ic=0;
while(ia<la->size&&ib<lb->size)
{
if(la->base[ia]<lb->base[ib])
{
lt->base[ic++]=la->base[ia++];
}
else
{
lt->base[ic++]=lb->base[ib++];
}
}
while(ia<la->size)
{
lt->base[ic++]=la->base[ia++];
}
while(ib<lb->size)
{
lt->base[ic++]=lb->base[ib++];
}
lt->size=la->size+lb->size;
show_list(lt);
}
#include "seqlist.h"
int main()
{
Seqlist list;
InitSeqlist(&list);
//create_list(&list);
ElemType item;
int pos;
int select=1;
printf("*******************************************
");
printf("*[1] push_back [2] push_front *
");
printf("*[3] show_list [4] pop_back *
");
printf("*[5] pop_front [6] insert_pos *
");
printf("*[7] find [8] length *
");
printf("*[9] delete_pos [10] delete_value *
");
printf("*[11] sort [12] reverse *
");
printf("*[13] clear [14] merge *
");
printf("*[0] quit_system *
");
printf("*******************************************
");
while(select)
{
printf("請選擇:>>");
scanf("%d",&select);
if(select==0)
break;
switch(select)
{
case 1:
printf("請輸入要插入的數據(-1結束)");
while(scanf("%d",&item),item!=-1)
{
push_back(&list,item);
}
break;
case 2:
printf("請輸入要插入的數據(-1結束)");
while(scanf("%d",&item),item!=-1)
{
push_front(&list,item);
}
break;
case 3:
show_list(&list);
break;
case 4:
pop_back(&list);
break;
case 5:
pop_front(&list);
break;
case 6:
printf("請輸入要插入的數據:");
scanf("%d",&item);
printf("請輸入要插入的位置:");
scanf("%d",&pos);
insert_pos(&list,pos,item);
break;
case 7:
printf("請輸入要查找的數據:");
scanf("%d",&item);
pos=find(&list,item);
if(pos=-1)
printf("要查找的元素不在順序表中");
else
printf("查找元素的在順序表中的下標位置為:%d
",pos);
break;
case 8:
printf("順序表的長度為%d",length(&list));
break;
case 9:
printf("請輸入要刪除的值的下標位置:");
scanf("%d",&pos);
delete_pos(&list,pos);
break;
case 10:
printf("請輸入喲啊刪除的值");
scanf("%d",&item);
delete_val(&list,item);
break;
case 11:
sort(&list);
break;
case 12:
reverse(&list);
break;
case 13:
clear(&list);
break;
case 14:
Seqlist mylist,yourlist;
ElemType item1,item2;
InitSeqlist(&mylist);
InitSeqlist(&yourlist);
printf("請輸入順序表1中的元素值");
while(scanf("%d",&item1),item1!=-1)
{
push_back(&mylist,item1);
}
printf("請輸入順序表2中的元素值");
while(scanf("%d",&item2),item2!=-1)
{
push_back(&yourlist,item2!=-1);
}
merge(&list,&mylist,&yourlist);
destroy(&mylist);
destroy(&yourlist);
break;
case 15:
create_list(&list);//順序表的創建,輸入數據
break;
default:
printf("輸入的選擇錯誤");
break;
}
}
destroy(&list);
}
※Spring AOP 實現日誌記錄功能
※J2EE RestFul服務介紹
TAG:程序員小新人學習 |