苏嵌教育 暑期实习
学习日志 姓名:胡昊 日期:2018.7.21
- 今日学习任务: 学习链表。
- 今日任务完成情况: 完成链表的操作函数,实现了链表建立,增加,删除。主要代码:
/************************************************************************* > File Name: LinkList.c > Author: HuHao > Mail: 1434203734@qq.com > Created Time: 2018年07月20日 星期五 21时10分56秒 ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存储空间初始分配量 */ typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */ typedef struct Node { ElemType data; struct Node *next; }Node; typedef struct Node * LinkList; /* 定义LinkList */ /*定义输出函数*/ Status visit(ElemType c) { printf("%d\n",c); return OK; } /* 初始化链表 */ Status InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(Node));/* 产生头结点,并使L指向此头结点 */ if(NULL == (*L))/* 存储分配失败 */ return ERROR; (*L)->next=NULL;/* 指针域为空 */ return OK; } /* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */ Status ListEmpty(LinkList L) { if(L->next==NULL) return TRUE; else return FALSE; } /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */ Status ClearList(LinkList *L) { LinkList p,q; p=(*L)->next; while(p) { q=p->next; free(p); p=q; } (*L)->next=NULL; return OK; } /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */ int ListLength(LinkList L) { int i=0; LinkList p=L->next; while(p!=NULL) { p=p->next; i++; } return i; } /* * 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) *操作结果:用e返回L中第i个数据元素的值 */ Status GetElem(LinkList L,int i,ElemType *e) { int j; LinkList p=L->next; j=1; while(p!=NULL&&j!=i) { p=p->next; j++; } if(p==NULL || j>i) return ERROR; *e=p->data; return OK; } /* 初始条件:顺序线性表L已存在 * 操作结果:返回L中第1个与e满足关系的数据元素的位序。 * 若这样的数据元素不存在,则返回值为0 */ int LocateElem(LinkList L,ElemType e) { int i=0; LinkList p=L->next; while(p!=NULL) { i++; if(p->data==e) return i; } return 0; } /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1, * 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */ Status ListInsert(LinkList *L,int i,ElemType e) { int j=1; LinkList p,q; p=*L; while(p!=NULL && j<i) { p=p->next; j++; } if(p==NULL || j>i) return ERROR; q=(LinkList)malloc(sizeof(Node)); q->data=e; q->next=p->next; p->next=q; return OK; } /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) * 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */ Status ListDelete(LinkList *L,int i,ElemType *e) { int j=1; LinkList p,q; p=*L; while(p!=NULL && j<i) { p=p->next; j++; } if(p==NULL || j>i) return ERROR; q=p->next; p->next=q->next; *e=q->data; free(q); return OK; } /* 初始条件:顺序线性表L已存在 * 操作结果:依次对L的每个数据元素输出 */ Status ListTraverse(LinkList L) { LinkList p = L->next; if(p==NULL) return ERROR; while(p!=NULL) { visit(p->data); p=p->next; } printf("\n"); return OK; } /* * 随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */ void CreateListHead(LinkList *L, int n) { LinkList p; int i; srand(time(NULL)); *L=(LinkList)malloc(sizeof(Node)); (*L)->next=NULL; for(i=0;i<n;i++) { p=(LinkList)malloc(sizeof(Node)); p->data=rand()%100+1; p->next=(*L)->next; (*L)->next=p; } } /* * 随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */ void CreateListTail(LinkList *L, int n) { LinkList p,q; int i; srand(time(NULL)); *L=(LinkList)malloc(sizeof(Node)); q=*L; for(i=0;i<n;i++) { p=(LinkList)malloc(sizeof(Node)); p->data=rand()%100+1; q->next=p; q=p; } q->next=NULL; } int main() { return 0; }
- 今日开发中出现的问题汇总: 对指针的使用,形参和实参的区别。
- 今日未解决问题: 无
- 自我评价: 自我感觉良好,基本掌握了新知识。
- 其他: 随着一天的学习落幕,收获满满,期待着明天的学习和明天的收获。