一个关于C语言单链表的简单应用程序

C语言代码对初学者来说是一个比较揪心的东西,尤其是结构体和传值传地址的用法。这里我给出了一个简单的单链表的代码,希望大家看一下,尤其注意一下传入子函数的参数形式。

#include "stdio.h"

#include "stdlib.h"

#include "time.h"

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

typedef int Status;  

typedef int ElemType;

typedef struct Node{

ElemType data;

struct Node *next;

}*LinkList;

Status GetElem(LinkList L,int i,ElemType e)

{

    int j=0;

    LinkList p=L;

    while(j

    {

        j++;

        p=p->next;

    }

    if(p==NULL)

        return FALSE;

    else{e = p->data; return e;}

}

Status LocateElem(LinkList L, ElemType e)

{

    int i = 1;

    LinkList p=L->next;

    while(p!=NULL && p->data!=e)

    {

        p=p->next;

        i++;

    }

    if(p==NULL)

        return FALSE;

    else

        return (i);

}

Status ListInsert(LinkList *L, int i, ElemType e)

{

int j=0;

LinkList p=*L,s;

while(j

{j++;p=p->next;}

if(p==NULL)

return FALSE;

else

{

s=(LinkList)malloc(sizeof(LinkList));

s->data=e;

s->next=p->next;

p->next=s;

return TRUE;

}

}

Status ListDelete(LinkList *L, int i, ElemType e)

{

int j=0;

LinkList p=*L,q;

while(j

{

j++;

p=p->next;

}

if(p==NULL)

return FALSE;

else

{

q=p->next;

if(q==NULL)

return FALSE;

e=q->data;

p->next=q->next;

free(q);

return e;

}

}

Status visit(ElemType c)

{

    printf("%d ",c);

    return OK;

}

Status InitList(LinkList *L)

{

    *L=(LinkList)malloc(sizeof(Node));

    if(!(*L))

    {

        return ERROR;

    }

    (*L)->next=NULL;

    return OK;

}

int ListLength(LinkList L)

{

    int i=0;

    LinkList p=L->next;

    while(p)

    {

        i++;

        p=p->next;

    }

    return i;

}

Status ListTraverse(LinkList L)

{

    LinkList p=L->next;

    while(p)

    {

        visit(p->data);

        p = p->next;

    }

    printf("\n");

    return OK;

}

void CreateListTail(LinkList *L, int n)

{

LinkList p,r;

int i;

srand(time(0));                      

*L = (LinkList)malloc(sizeof(Node));

r=*L;                                

for (i=0; i < n; i++)

{

p = (Node *)malloc(sizeof(Node));

p->data = rand()0+1;          

r->next=p;                        

r = p;                            

}

r->next = NULL;                      

// 创建有环链表

    //r->next = p;

}

Status GetMidNode(LinkList L, ElemType *e)

{

    LinkList search, mid;

    mid = search = L;

    while (search->next != NULL)

    {

        //search移动的速度是 mid 的2倍

        if (search->next->next != NULL)

        {

            search = search->next->next;

            mid = mid->next;

        }

        else

        {

            search = search->next;

        }

    }

    *e = mid->data;

    return OK;

}

int main()

{

    LinkList L;

    Status i;

    char opp;

    ElemType e;

    Status find;

Status tmp;

    i=InitList(&L);

    printf("初始化L后:ListLength(L)=%d\n",ListLength(L));

    printf("\n1.查看链表 \n2.创建链表(尾插法) \n3.链表长度 \n4.中间结点值 \n5.第i个位置的元素值 \n6.确定元素的位置\n7.添加元素噢!\n8.删除元素噢!\n0.退出 \n请选择你的操作:\n");

    while(opp != '0')

    {

        scanf("%c",&opp);

        switch(opp)

        {

            case '1':

                ListTraverse(L);

                printf("\n");

                break;

            case '2':

                CreateListTail(&L,20);

                printf("整体创建L的元素(尾插法):\n");

                ListTraverse(L);

                printf("\n");

                break;

            case '3':

                //clearList(pHead);   //清空链表

                printf("ListLength(L)=%d \n",ListLength(L));

                printf("\n");

                break;

            case '4':

                //GetNthNodeFromBack(L,find,&e);

                GetMidNode(L, &e);

                printf("链表中间结点的值为:%d\n", e);

                //ListTraverse(L);

                printf("\n");

                break;

case '5':

printf("你想看哪个位置的元素?\n");

scanf("%d", &i);

e=GetElem(L,i,e);

printf("第%d个数是%d",i,e);

printf("\n");

                break;

case '6':

printf("请输入你要确定位置的元素:\n");

scanf("%d", &e);

find=LocateElem(L,e);

printf("该值的位置为%d\n", find);

break;

case '7':

printf("请输入你要添加的元素:\n");

scanf("%d",&e);

printf("请输入你要插入的位置:\n");

scanf("%d", &i);

tmp=ListInsert(&L,i,e);

if(tmp=1)printf("成功!");

else printf("失败!");

ListTraverse(L);

break;

case '8':

printf("请输入你要释放的元素的位置:\n");

scanf("%d", &i);

tmp=ListDelete(&L,i,e);

printf("元素%d已经被删除\n",tmp);

ListTraverse(L);

break;

case '0':

                exit(0);

        }

    }

return 0;

}


转载于:https://my.oschina.net/qkmc/blog/654854

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值