資料結構(順序表的兩個操作)

來源:互聯網
上載者:User

順序表的 A並B 的合併作業,以及連個非遞減型順序表合并成一個非遞減型順序表。

由於標頭檔內容比較多,這裡沒有用include~~~因為blog上~~~就直接複製過來了~~~木有刪改~~

 #include<string.h> #include<ctype.h> #include<malloc.h> /* malloc()等 */ #include<limits.h> /* INT_MAX等 */ #include<stdio.h> /* EOF(=^Z或F6),NULL */ #include<stdlib.h> /* atoi() */ #include<io.h> /* eof() */ #include<math.h> /* floor(),ceil(),abs() */ #include<process.h> /* exit() */ /* 函數結果狀態碼 */ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 /* #define OVERFLOW -2 因為在math.h中已定義OVERFLOW的值為3,故去掉此行 */ typedef int Status; /* Status是函數的類型,其值是函數結果狀態碼,如OK等 */ typedef int Boolean; /* Boolean是布爾類型,其值是TRUE或FALSE */ typedef int ElemType; #define LIST_INIT_SIZE 10  #define LISTINCREMENT 2  typedef struct {   ElemType *elem;    int length;    int listsize;  }SqList;  //----start----------順序表的基本操作(12個) ----------------start---------------// Status InitList(SqList *L)  { /* 操作結果:構造一個空的順序線性表 */   (*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));   if(!(*L).elem)     exit(OVERFLOW); /* 儲存分配失敗 */   (*L).length=0; /* 空表長度為0 */   (*L).listsize=LIST_INIT_SIZE; /* 初始儲存容量 */   return OK; } Status DestroyList(SqList *L) { /* 初始條件:順序線性表L已存在。操作結果:銷毀順序線性表L */   free((*L).elem);   (*L).elem=NULL;   (*L).length=0;   (*L).listsize=0;   return OK; } Status ClearList(SqList *L) { /* 初始條件:順序線性表L已存在。操作結果:將L重設為空白表 */   (*L).length=0;   return OK; } Status ListEmpty(SqList L) { /* 初始條件:順序線性表L已存在。操作結果:若L為空白表,則返回TRUE,否則返回FALSE */   if(L.length==0)     return TRUE;   else     return FALSE; } int ListLength(SqList L) { /* 初始條件:順序線性表L已存在。操作結果:返回L中資料元素個數 */   return L.length; } Status GetElem(SqList L,int i,ElemType *e) { /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */   /* 操作結果:用e返回L中第i個資料元素的值 */   if(i<1||i>L.length)     exit(ERROR);   *e=*(L.elem+i-1);   return OK; } int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)) { /* 初始條件:順序線性表L已存在,compare()是資料元素判定函數(滿足為1,否則為0) */   /* 操作結果:返回L中第1個與e滿足關係compare()的資料元素的位序。 */   /*           若這樣的資料元素不存在,則傳回值為0。演算法2.6 */   ElemType *p;   int i=1; /* i的初值為第1個元素的位序 */   p=L.elem; /* p的初值為第1個元素的儲存位置 */   while(i<=L.length&&!compare(*p++,e))     ++i;   if(i<=L.length)     return i;   else     return 0; } Status PriorElem(SqList L,ElemType cur_e,ElemType *pre_e) { /* 初始條件:順序線性表L已存在 */   /* 操作結果:若cur_e是L的資料元素,且不是第一個,則用pre_e返回它的前驅, */   /*           否則操作失敗,pre_e無定義 */   int i=2;   ElemType *p=L.elem+1;   while(i<=L.length&&*p!=cur_e)   {     p++;     i++;   }   if(i>L.length)     return INFEASIBLE;   else   {     *pre_e=*--p;     return OK;   } } Status NextElem(SqList L,ElemType cur_e,ElemType *next_e) { /* 初始條件:順序線性表L已存在 */   /* 操作結果:若cur_e是L的資料元素,且不是最後一個,則用next_e返回它的後繼, */   /*           否則操作失敗,next_e無定義 */   int i=1;   ElemType *p=L.elem;   while(i<L.length&&*p!=cur_e)   {     i++;     p++;   }   if(i==L.length)     return INFEASIBLE;   else   {     *next_e=*++p;     return OK;   } } Status ListInsert(SqList *L,int i,ElemType e) /* 演算法2.4 */ { /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L)+1 */   /* 操作結果:在L中第i個位置之前插入新的資料元素e,L的長度加1 */   ElemType *newbase,*q,*p;   if(i<1||i>(*L).length+1) /* i值不合法 */     return ERROR;   if((*L).length>=(*L).listsize) /* 當前儲存空間已滿,增加分配 */   {     newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));     if(!newbase)       exit(OVERFLOW); /* 儲存分配失敗 */     (*L).elem=newbase; /* 新基址 */     (*L).listsize+=LISTINCREMENT; /* 增加儲存容量 */   }   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 */   return OK; } Status ListDelete(SqList *L,int i,ElemType *e) /* 演算法2.5 */ { /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */   /* 操作結果:刪除L的第i個資料元素,並用e返回其值,L的長度減1 */   ElemType *p,*q;   if(i<1||i>(*L).length) /* i值不合法 */     return ERROR;   p=(*L).elem+i-1; /* p為被刪除元素的位置 */   *e=*p; /* 被刪除元素的值賦給e */   q=(*L).elem+(*L).length-1; /* 表尾元素的位置 */   for(++p;p<=q;++p) /* 被刪除元素之後的元素左移 */     *(p-1)=*p;   (*L).length--; /* 表長減1 */   return OK; } Status ListTraverse(SqList L,int (*vi)(ElemType*)) { /* 初始條件:順序線性表L已存在 */   /* 操作結果:依次對L的每個資料元素調用函數vi()。一旦vi()失敗,則操作失敗 */   /*           vi()的形參加'&',表明可通過調用vi()改變元素的值 */   ElemType *p;   int i;   p=L.elem;   for(i=1;i<=L.length;i++)     vi(p++);   printf("\n");   return OK; }//---------end-----順序表的基本操作(12個) ---------------end----------------//   Status equal(ElemType c1,ElemType c2) { // 判斷是否相等的函數,Union()用到   if(c1==c2)     return TRUE;   else     return FALSE; } void Union(SqList &La,SqList Lb) // 演算法2.1 { // 將所有線上性表Lb中但不在La中的資料元素插入到La中   ElemType e;   int La_len,Lb_len;   int i;   La_len=ListLength(La); // 求線性表的長度   Lb_len=ListLength(Lb);   for(i=1;i<=Lb_len;i++)   {     GetElem(Lb,i,&e); // 取Lb中第i個資料元素賦給e     if(!LocateElem(La,e,equal)) // La中不存在和e相同的元素,則插入之       ListInsert(&La,++La_len,e);   } }int print(ElemType *c) {   printf("%d ",*c);   return 0; }void MergeList(SqList La,SqList Lb,SqList *Lc) /* 演算法2.2 */ { /* 已知線性表La和Lb中的資料元素按值非遞減排列。 */   /* 歸併La和Lb得到新的線性表Lc,Lc的資料元素也按值非遞減排列 */   int i=1,j=1,k=0;   int La_len,Lb_len;   ElemType ai,bj;   InitList(Lc); /* 建立空表Lc */   La_len=ListLength(La);   Lb_len=ListLength(Lb);   while(i<=La_len&&j<=Lb_len) /* 表La和表Lb均非空 */   {     GetElem(La,i,&ai);     GetElem(Lb,j,&bj);     if(ai<=bj)     {       ListInsert(Lc,++k,ai);       ++i;     }     else     {       ListInsert(Lc,++k,bj);       ++j;     }   }   while(i<=La_len) /* 表La非空且表Lb空 */   {     GetElem(La,i++,&ai);     ListInsert(Lc,++k,ai);   }   while(j<=Lb_len) /* 表Lb非空且表La空 */   {     GetElem(Lb,j++,&bj);     ListInsert(Lc,++k,bj);   } } int main() {   SqList La,Lb,Lc;   Status i;   int j;   i=InitList(&La);   if(i==1) // 建立空表La成功     for(j=1;j<=5;j++) // 在表La中插入5個元素       i=ListInsert(&La,j,j);   printf("La= "); // 輸出表La的內容      ListTraverse(La,print);   InitList(&Lb); // 也可不判斷是否建立成功   for(j=1;j<=5;j++) // 在表Lb中插入5個元素     i=ListInsert(&Lb,j,2*j);   printf("Lb= "); // 輸出表Lb的內容   ListTraverse(Lb,print);   Union(La,Lb);   printf("new La= "); // 輸出新表La的內容   ListTraverse(La,print);   InitList(&Lc);//初始化Lc   MergeList(La,Lb,&Lc);   printf("\n兩個非遞減序列合并後的非遞減序列Lc= "); /* 輸出表Lc的內容 */   ListTraverse(Lc,print);   printf("\n");      return 0; }   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.