1. 順序存儲結構:把數據元素放在 地址連續的存儲單元里
定義一個結構放順序存儲的內容
typedef struct seqlist{ int data[10]; //順序表中的實際內容 int last; // 順序表中的數據元素,從 0 開始 }seqlist,*Seqlist; // 順序表類型
//重新定義一個指針類型 這只是聲明了一個類型, 並沒有實際的變量,也沒有申請空間
2. 順序表的操作
1. 建空表,
2. 插入元素,
3.刪除元素,
4. 按位置查找元素,
5. 按照元素查找位置,
6. 去除表中重復元素,
7. 求表長度 ( 表中實際元素個數 ) ,
8. 修改表中元素值,合並2個順序表,
9. 銷毀順序表
3. 源碼:一級指針建表方式實現
seqlist.c文件
/* 一級指針建表 */ #include "seqlist.h" //創建一個空的順序表 Seqlist *creat_seqlist(void) { Seqlist *list = NULL;//初始化為空 list = (Seqlist*)malloc(sizeof(Seqlist));//堆中申請一個空間存放表 // list = (Seqlist*)malloc(-1); //失敗, // malloc函數沒執行情況,list沒有初始化,指向的是野指針 if(NULL == list) //區分malloc的NULL與初始化的NULL { printf("\tmalloc error\n"); return NULL; } list->last = -1; //建表清空 return list; } //清空表 void clear_seqlist(Seqlist *list) { if(list ==NULL)//判斷傳入的值是否有效 { printf("\tlist is NULL\n"); return ; } list->last = -1; } //判斷表是否為空,1為空, 0為非空 int is_empty_seqlist(Seqlist *list) { if(NULL == list) { printf("\tlist is NULL\n"); return -1; } return ((list->last==-1)?1:0) ; } //判斷滿 , 1 滿 ;0不滿 -1 表空 int is_full_seqlist(Seqlist *list) { if(NULL == list) { printf("\tlist is NULL\n"); return -1; } return ((list->last==(MAXSIZE-1))?1:0); } //插入數據 -1 失敗 1成功 int inster_seqlist(Seqlist *list, int pos ,int value) { if(NULL == list) { printf("\tinster list is null\n"); return -1; } if(is_full_seqlist(list) == 1)//表滿 { printf("\tinster list is full\n"); return -1; } if(pos<0 || pos > list->last+1)//插入位置無效 { printf("\tinster pos is error\n"); return -1; } int i=0; //把插入的pos位置到末尾這區域的值集體向后移動 //就是下標pos至list->last集體后移一位 for(i=list->last;i>=pos;i--) { list->data[i+1] = list->data[i]; } list->data[pos] = value; list->last++; return 1; } //遍歷顯示順序表中的內容,以last為准 void show_seqlist(Seqlist *list) { if(NULL == list) { printf("\tshow list is null\n"); return ; } if(is_empty_seqlist(list)==1) { printf("\tshow list is empty\n"); return ; } int i=0; for(i=0;i<=list->last;i++) { printf("\t%d\n",list->data[i]); } } //刪除表中一個元素 1成功 -1失敗 //參數:要操作的表list,要刪除的位置pos, 刪除的內容放在value中 int del_seqlist(Seqlist *list, int pos, int *value) { if(NULL == list) { printf("\tdelete list is null\n"); return -1; } if(is_empty_seqlist(list) == 1) //傳的list是否為空 { printf("\tdel_seqlist list is null\n"); return -1; } if(pos<0 || pos>list->last)//傳入的位置合理,刪除元素,元素下標 0~list->last { printf("\tpos is error\n"); return -1; } *value = list->data[pos];//取出要刪除位置的數據 int i=0; //需要移動的數據下標范圍,pos+1 ~ last //要刪除的位置pos,要移動數據的位置pos+1~last //pos在最后一個位置時,循環條件不滿足,直接不執行移位 // for(i=pos+1;i<=list->last;i++) // { // list->data[i-1] = list->data[i]; // } for(i=pos;i<list->last;i++) { list->data[i] = list->data[i+1]; } list->last--; return 1; } //求表長,表中實際的元素個數 int length_seqlist(Seqlist *list) { if(NULL == list) { printf("\tlength list is null\n"); return -1; } if(is_empty_seqlist(list)==1)//表空 0 個元素 { return 0; } return (list->last+1); } //獲取數據 int getdata_seqlist(Seqlist *list, int pos) { if(NULL == list) { printf("\tgetdata list is null\n"); return -1; } if(is_empty_seqlist(list)==1) { printf("\tgetdata list is empty\n"); return -1; } if(pos<0 || pos>list->last) { printf("\tgetdata pos is error\n"); return -1; } return list->data[pos]; } //第一次出現的位置 //給元素獲取位置 int getpos_seqlist(Seqlist *list, int data) { if(NULL == list) { printf("\tgetpos list is null\n"); return -1; } if(is_empty_seqlist(list)==1) { printf("\tgetpos list is empty\n"); return -1; } int i=0; for(i=0;i<=list->last;i++) { if(data == list->data[i]) { return i; } } return -1; #if 0 int tip=-1; for(i=0;i<=list->last;i++) { if(list->data[i]==data) { tip=i; break; } } return tip; #endif } /*銷毀表時需要,傳遞需要銷毀表的地址,類似於使用函數交換數據 * 傳值是不能修改數據內容的,需要傳遞地址,才可以修改數據內容, *此處也就是傳遞的二級指針 * */ //銷毀表 void free_seqlist(Seqlist **list) { if(list == NULL || *list == NULL) { printf("\tlist is null\n"); } free(*list); *list=NULL; } //修改表中的某個值 int change_seqlist(Seqlist *list, int pos, int value) { if(list == NULL){ printf("change list is null\n");return -1; } if(pos<0 || pos>list->last)//pos位置不合理 { printf("change list pos is error\n"); return -1; } list->data[pos] = value;//改值 return 1; } //刪除表中重復的內容 int del_repeat_seqlist(Seqlist *list) { int a; if(list == NULL){ printf("del repeat list is null\n");return -1; } int i,j; for(i=0;i<length_seqlist(list);i++)//在刪除元素時,表的長度是變化的 { for(j=i+1;j<length_seqlist(list);j++)//查看表的長度是,表中數據個數 { if(list->data[i]==list->data[j])//找到兩個相等的元素 { if(del_seqlist(list,j,&a) == -1) //刪除過程失敗 { printf("del_repeat_seqlist is error\n"); return -1; } j--; printf("repeat data %d\n",a); } } } return 1; } int merge_seqlist(Seqlist *list_a, Seqlist *list_b)//合並兩個表,重復的數據刪除 { if(list_a==NULL || list_b==NULL){ printf("merge list is null\n");return -1; } int i=0; //把表b中的數據,在表a中獲取位置,沒有位置, //說明沒有這個元素,獲取到位置說明存在這個元素, //把表b中這個元素刪除 for(i=0;i<=list_b->last;i++) { if(getpos_seqlist(list_a,list_b->data[i]) == -1)//表a中,無表b中這個元素 { if(inster_seqlist(list_a,0,list_b->data[i]) == -1)//在表a中,插入這個表b中的元素 { printf("merge inster error\n"); return -1; } } } return 1; }
seqlist.h文件:
#ifndef __SEQLIST_H #define __SEQLIST_H #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 typedef struct list{ int data[MAXSIZE]; //存放表的內容 int last; // 表的實際用的內容大小 }Seqlist; Seqlist *creat_seqlist(void);//建一個空表 void clear_seqlist(Seqlist *list);//清空表 int is_empty_seqlist(Seqlist *list);//判斷表是否為空 int is_full_seqlist(Seqlist *list);//判斷表滿 int inster_seqlist(Seqlist *list, int pos, int value);//插入數據 void show_seqlist(Seqlist *list);//顯示內容 int del_seqlist(Seqlist *list, int pos, int *value);//刪除表中一個元素 int length_seqlist(Seqlist *list);//求表長 int getdata_seqlist(Seqlist *list, int pos);//獲取數據 int getpos_seqlist(Seqlist *list, int data);//給元素獲取位置 void free_seqlist(Seqlist **list);//銷毀表 int change_seqlist(Seqlist *list, int pos, int value);//修改表中的某個值 int del_repeat_seqlist(Seqlist *list);//刪除表中重復的內容 int merge_seqlist(Seqlist *list_a, Seqlist *list_b);//合並兩個表,重復的數據刪除 #endif
測試main.c文件
#include <stdio.h> #include "seqlist.h" int main(int argc, const char *argv[]) { int i=0; //插入數據 表1 printf("create s1 \n"); Seqlist *s1=creat_seqlist(); if(NULL == s1)//建表失敗 { printf("s1 create error\n"); return -1; } for(i=0;i<4;i++) inster_seqlist(s1,0,i); inster_seqlist(s1,0,1); printf("show s1 data\n"); show_seqlist(s1); del_repeat_seqlist(s1); show_seqlist(s1); //操作表 2 printf("create s2\n"); Seqlist *s2=creat_seqlist(); if(NULL == s2)//建表失敗 { printf("s1 create error\n"); return -1; } for(i=0;i<4;i++) inster_seqlist(s2,0,i+1); printf("show s2 data\n"); show_seqlist(s2); printf("merge_seqlist\n"); merge_seqlist(s1,s2); printf("\n\n show s1 \n"); show_seqlist(s1); //釋放內存 free_seqlist(&s1); if(s1==NULL) { printf("\ts is null\n"); } free_seqlist(&s2); if(s2==NULL) { printf("\ts is null\n"); } return 0; }
結果: