大三秋季数据结构课程代码整理
Posted keynman
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大三秋季数据结构课程代码整理相关的知识,希望对你有一定的参考价值。
数学系上的数据结构课程相对比较水:),下面的代码是朱明老师布置的习题.
//课本为?数据结构-使用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("顺序表已满无法插入! "); return 0; } else if(i<0 || i>L->size) { printf("参数i不合法! "); 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("顺序表已空无数据元素可删! "); return 0; } else if(i<0 || i>L->size-1) { printf("参数i不合法! "); 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("顺序表已空无数据元素可取! "); return 0; } else if(i<0 || i>L.size-1) { printf("参数i不合法! "); return 0; } else { *x =L.list[i]; return 1; } } int ListPrint(SeqList L) { int i; if(L.size == 0) { printf("empty list "); 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("插入位置参数错! "); 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("删除位置参数错! "); 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("取元素位置参数错! "); 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("表列为空 "); 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; } }
//未完待续...
以上是关于大三秋季数据结构课程代码整理的主要内容,如果未能解决你的问题,请参考以下文章