苏嵌教育 暑期实习
学习日志 姓名:胡昊 日期:2018.7.21
- 今日学习任务: 学习链表。
- 今日任务完成情况: 完成链表的操作函数,实现了链表建立,增加,删除。主要代码:
/************************************************************************* > File Name: MailList.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> #include <unistd.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存储空间初始分配量 */ char *menu[]={"***********************************", "**1.查询所有联系人 **", "**2.姓名查询联系人 **", "**3.插入联系人 **", "**4.删除联系人 **", "**5.清空联系人 **", "**0.退出 **", "***********************************" }; typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef struct MailList { char name[20]; char telephone[12]; char address[20]; }ElemType;/* ElemType类型根据实际情况而定,这里假设为int */ typedef struct Node { ElemType data; struct Node *next; }Node; typedef struct Node * LinkList; /* 定义LinkList */ /*定义输出函数*/ Status visit(ElemType c) { printf("Success query!\n"); printf("name:%s\n",c.name); printf("telephone:%s\n",c.telephone); printf("address:%s\n",c.address); printf("end\n"); return OK; } /* 初始化链表 */ Status InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(Node));/* 产生头结点,并使L指向此头结点 */ if(NULL == (*L))/* 存储分配失败 */ return ERROR; (*L)->next=NULL;/* 指针域为空 */ printf("Mail List init success!\n"); 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; printf("Clear success!\n"); 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.telephone==e.telephone) 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; printf("Insert success!\n"); 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); printf("Delete Success!\n"); 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 LocateName(LinkList L,int i,char a[]) { int j=0; LinkList p=L->next; while(p!=NULL && j<i) { j++; if(strcmp(p->data.name,a)==0); return j; } printf("Query no result!"); return 0; } void ShowMenu(char *menu[]) { for(int i=0;i<8;i++) printf("%s\n",*(menu+i)); } int UseMenu(LinkList L,LinkList *List,int i,ElemType *elem) { if(i==0) { printf("Thank your use!\n"); return 0; } else if(i==1) { if(ListEmpty(L)==TRUE) { printf("Mail List is NULL,please input data!\n"); return 1; } ListTraverse(L); return 1; } else if(i==2) { if(ListEmpty(L)==TRUE) { printf("Mail List is NULL,please input data!\n"); return 1; } printf("Please input name:"); char a[20]; scanf("%s",a); int j=ListLength(L); int k=LocateName(L,j,a); GetElem(L,k,elem); ElemType e=*elem; visit(e); return 1; } else if (i==3) { int j=0; printf("Please input location:"); scanf("%d",&j); ElemType e; printf("Please input name:"); scanf("%s",e.name); printf("Please input telephone:"); scanf("%s",e.telephone); printf("Please input address:"); scanf("%s",e.address); ListInsert(List,j,e); visit(e); return 2; } else if (i==4) { if(ListEmpty(L)==TRUE) { printf("Mail List is NULL,please input data!\n"); return 1; } int j=ListLength(L); char a[20]; printf("Please input name:"); scanf("%s",a); int k=LocateName(L,j,a); ListDelete(List,k,elem); return 2; } else if (i==5) { ClearList(List); return 2; } else return 0; return 0; } int main() { int choose=1; ElemType e; LinkList List; InitList(&List); int i=0; while(choose!=0) { ShowMenu(menu); printf("Please input your choose:"); scanf("%d",&i); choose=UseMenu(List,&List,i,&e); if(choose == 2 || choose == 0) { sleep(3); system("clear"); } } return 0; }
- 今日开发中出现的问题汇总: 对指针的使用,形参和实参的区别。
- 今日未解决问题: 无
- 自我评价: 自我感觉良好,基本掌握了新知识。
- 其他: 随着一天的学习落幕,收获满满,期待着明天的学习和明天的收获。