单向链表
明天要考四级,所以其实想写很多东西但是也没有时间细细写了,感觉写博客不只是写那么简单,他需要人安静的思考。所以就先写一个单向链表的代码吧。这是我第一次使用链表这种数据结构,所以加了很多注释。注释的风格十分的小白,不要介意啊哈。
想通过这些代码实现一个单向链表的加入数据,搜索数据以及删除数据的功能。
/*这个程序希望可以实现一些单向链表的常用操作*/ #include <stdio.h> #include <stdlib.h> typedef struct List{ int value; struct list *next; } Date; typedef struct List2{ Date* head; /*head指向Date链表的头部*/ Date* tail; /*tail指向Date链表的尾部*/ } Date2 ; /*这个函数负责添加数据到链表中*/ void add(int n,Date2* plist) { Date *p=(Date *)malloc(sizeof(Date)); p->value=n; p->next=NULL; Date *q; if(plist->head==NULL) /*当链表为空的时候*/ { plist->head=p; plist->tail=p; /*此时该链表的头和尾均为p指的内容*/ } else { q=plist->tail; plist->tail=p; q->next=plist->tail; } } /*遍历链表输出数据*/ void print(Date2 *plist) { Date *p; for(p=plist->head;p;p=p->next) { printf("%d\t",p->value); } printf("\n"); } /*查找数据,如果存在返回1,否则返回0*/ int find(int number,Date2* plist) { Date *p; int flag=0; for(p=plist->head;p;p=p->next) { if(p->value==number) { flag=1; break; } } return flag; } /*这个函数用来删除数据,如果没有这个数据则返回0*/ void Delete(int number2,Date2* plist) { Date *p,*q; /*p和q这两个指针一前一后*/ int flag=0; for(p=NULL,q=plist->head;q;p=q,q=q->next) { if(q->value==number2) { if(p){ p->next=q->next; } else{ plist->head=q->next; } free(q); flag=1; break; } } if(!flag) printf("没找到该数据。\n"); else printf("已删除。\n"); } void Free(Date2 *plist) { Date*p,*q=NULL; for(p=plist->head;p;p=q) { q=p->next; free(p); } } int main() { Date2 list; /*定义了一个指向Date2的指针list*/ list.head=list.tail=NULL; int n,number,ret,number2; do { printf("\n请输入下一个数:\n"); scanf("%d",&n); if(n!=-1) /*当读取到-1时结束链表的输入*/ { add(n,&list); /*把n添加到链表的末尾*/ } } while(n!=-1); print(&list); printf("输入你想查找的数字:\n"); scanf("%d",&number); ret=find(number,&list); printf("%d\n",ret); printf("请输入你想删除的数字:\n"); scanf("%d",&number2); Delete(number2,&list); print(&list); Free(&list); return 0; }
PS:希望明天能考好,基本上算是裸考了吧….不过把翁恺的课现在出的部分已经刷完了。近期的任务:明天下午争取把上篇字符串中的两个小坑填了。写一个双向链表,写几道OJ题,如果可能还是希望把翁恺老师最后一些课堂笔记(他关于全局变量和宏说的有些地方挺好的)写了。恩这周,没法刷Coursera了,没法看C和指针了,Java已经一周没看了。。。安卓的MSC也结束了,最终写出了一个记事本的布局文件。。。差强人意吧。总习惯在安卓一行代码后加分号….