大三秋季資料結構課程程式碼整理
阿新 • • 發佈:2018-11-05
數學系上的資料結構課程相對比較水:),下面的程式碼是朱明老師佈置的習題.
//課本為«資料結構-使用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,inti,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; } }
//未完待續...