单向链表

  明天要考四级,所以其实想写很多东西但是也没有时间细细写了,感觉写博客不只是写那么简单,他需要人安静的思考。所以就先写一个单向链表的代码吧。这是我第一次使用链表这种数据结构,所以加了很多注释。注释的风格十分的小白,不要介意啊哈。

  想通过这些代码实现一个单向链表的加入数据,搜索数据以及删除数据的功能。

/*这个程序希望可以实现一些单向链表的常用操作*/
#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也结束了,最终写出了一个记事本的布局文件。。。差强人意吧。总习惯在安卓一行代码后加分号….

posted @ 2015-12-18 21:43  小白酷狗  阅读(204)  评论(0编辑  收藏  举报