大三秋季數據結構課程代碼整理
阿新 • • 發佈:2018-11-05
des 使用 單鏈表 位置參數 del std 無法 輸出 class
數學系上的數據結構課程相對比較水:),下面的代碼是朱明老師布置的習題.
//課本為?數據結構-使用C語言?,作者:朱戰立.
先拋出頭文件:
//SeqList.h typedef struct { DataType list[MaxSize]; int size; }SeqList; void ListInitiate(SeqList *L) { L->size=0; } int ListLength(SeqList L) { return L.size; } int ListInsert(SeqList *L,int i,DataType x) {int j; if(L->size>=MaxSize) { printf("順序表已滿無法插入!\n"); return 0; } else if(i<0 || i>L->size) { printf("參數i不合法!\n"); return 0; } else { for(j=L->size;j>i;j--)L->list[j]=L->list[j-1]; L->list[i]=x; L->size++; return 1; } } int ListDelete(SeqList *L,int i,DataType *x) { int j; if(L->size<=0) { printf("順序表已空無數據元素可刪!\n"); return 0; } else if(i<0 || i>L->size-1) { printf("參數i不合法!\n");return 0; } else { *x =L->list[i]; for(j=i+1;j<=L->size-1;j++) L->list[j-1]=L->list[j]; L->size--; return 1; } } int ListGet(SeqList L,int i,DataType *x) { if(L.size<=0) { printf("順序表已空無數據元素可取!\n"); return 0; } else if(i<0 || i>L.size-1) { printf("參數i不合法!\n"); return 0; } else { *x =L.list[i]; return 1; } } int ListPrint(SeqList L) { int i; if(L.size == 0) { printf("empty list\n"); return 0; } for(i=0;i<(L.size);i++) { printf("%d ",L.list[i]); } puts(""); return 1; } int ListFind(SeqList L,DataType x) { int id=-1,i; for(i=0;i<L.size;i++) { if(L.list[i]==x) { id = i; break; } } return id; }
//LinList.h typedef struct Node { DataType data; struct Node *next; }SLNode; void ListInitiate(SLNode* *head) { if((*head = (SLNode *)malloc(sizeof(SLNode)))==NULL) exit(1); (*head) -> next = NULL; } int ListLength(SLNode *head) { SLNode *p = head; int ssize = 0; while(p->next != NULL) { p = p->next; ssize++; } return ssize; } int ListInsert(SLNode *head,int i,DataType x) { SLNode *p,*q; int j; p = head; j = -1; while(p->next != NULL && j<i-1) { p = p->next; j++; } if(j!=i-1) { printf("插入位置參數錯!\n"); return 0; } if((q = (SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1); q->data = x; q->next = p->next; p->next = q; return 1; } int ListDelete(SLNode *head,int i,DataType *x) { SLNode *p,*s; int j; p = head; j = -1; while(p->next != NULL && p->next->next != NULL && j<i-1) { p = p->next; j++; } if(j!=i-1) { printf("刪除位置參數錯!\n"); return 0; } s = p->next; *x = s->data; p->next = s->next; free(s); return 1; } int ListGet(SLNode *head,int i,DataType *x) { SLNode *p; int j; p = head; j = -1; while(p->next != NULL && j<i) { p = p->next; j++; } if(j!=i) { printf("取元素位置參數錯!\n"); return 0; } *x = p->data; return 1; } void Destroy(SLNode* *head) { SLNode *p,*q; p = *head; while(p!=NULL) { q = p; p = p->next; free(q); } *head = NULL; } void ListPrint(SLNode *head) { SLNode *p = head->next; if(p==NULL) { puts("Empty List!"); } while(p!=NULL) { printf("%d ",p->data); p=p->next; } puts(""); }
2-11:編寫一個逐個輸出順序表中所有數據元素的算法
int ListPrint(SeqList L) { int i; if(L.size == 0) { printf("表列為空\n"); return 0; } for(i=0;i<(L.size);i++) { printf("%d ",L.list[i]); } puts(""); return 1; }
2-13:線性表定位操作ListFind(L,x)的功能是:在線性表L中查找是否存在數據元素x,如果存在,返回線性表中與x值相等的第一個數據元素的序號(序號編號從0開始),如果不存在,返回-1.要求編寫順序表的定位操作算法.
int ListFind(SeqList L,DataType x) { int id=-1,i; for(i=0;i<L.size;i++) { if(L.list[i]==x) { id = i; break; } } return id; }
2-16:編寫算法實現順序表的就地逆置,即要求利用原順序表的存儲單元,把數據元素序列$(a_{0},a_{1},...,a_{n-1})$逆置為$(a_{n-1},...,a_{1},a_{0})$.
void ListInverse(SeqList *L) { int i,j; DataType t; for(i=0,j=(L->size)-1;i<j;i++,j--) { t = L->list[i]; L->list[i] = L->list[j]; L->list[j] = t; } }
2-17:編寫算法實現單鏈表的逆置,要求把單鏈表la中的數據元素序列$(a_{0},a_{1},...,a_{n-1})$逆置為$(a_{n-1},...,a_{1},a_{0})$,並把逆置後的數據元素存儲到單鏈表lb中
void ListInverse2(SLNode* la,SLNode* lb) { SLNode *p,*q; p = la->next; while(p!=NULL) { ListInsert(lb,0,p->data); p = p->next; } }
2-18:編寫算法實現單鏈表的就地逆置,即要求利用原單鏈表的結點空間,把數據元素序列$(a_{0},a_{1},...,a_{n-1})$逆置為$(a_{n-1},...,a_{1},a_{0})$.
void ListInverse1(SLNode *head) { SLNode *p = head->next,*q; head->next = NULL; while(p!=NULL) { q = p; p = p->next; q->next = head->next; head->next = q; } }
//未完待續...
大三秋季數據結構課程代碼整理