链表——C和Java实现

——2014.7.9 Java实现的链表(转http://blog.youkuaiyun.com/aaaaaaaa0705/article/details/6717166)——

网速可以再卡一点吗

 

——原始——

C语言实现的单链表

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef struct _Node

{

    char name[32];

    struct _Node *next;

} Node;

typedef struct _Node *PtrNode;//建立指向_Node类型数据的指针*PtrNode

void InitList(PtrNode *ls)//初始化链表

{

    *ls = (PtrNode)malloc(sizeof(Node));

    strcpy((*ls)->name, "Nothing"); //默认name值为Noting

    (*ls)->next = NULL;//默认为空指针

}

void CreateList(PtrNode ls, int n)//尾插法建立链表,结点数为n个

{

    PtrNode p, rear;

    char tmpName[32];//声明字符数组

    int i;

    rear = ls;

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

    {

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

        scanf("%s", tmpName);

        strcpy(p->name, tmpName);

        rear->next = p;  //给p节点的name、next赋值

        rear = p;   //rear回到链表最后位置

    }

    rear->next = NULL;  //链表尾节点指向空

}

void TraverseList(PtrNode ls) //遍历打印

{

    PtrNode p=ls->next;//p指向第一个结点

    while(p!=NULL)

    {

        printf("%s->", p->name);

        p = p->next;

    }

    printf("null\n");

}

PtrNode LocateElem(PtrNode ls, char key_name[32])//查找name值等于参数key_name的第一个结点,没有则返回空

{

    PtrNode p, q;

    p = ls;

    q = ls->next;

    while(q!=NULL)

    {

        if(strcmp(q->name, key_name)==0)

            break;  //找到与key_name相等的元素后直接跳出循环

        p = q;

        q = q->next;

    }

    if(q==NULL)

        return NULL;

    else

        return p;//此时p->next就是要找的结点

}

PtrNode GetElem(PtrNode ls, int j)//找到链表中第j个结点

{

    PtrNode p=ls;

    int i=0;

    if(j<0) return NULL;//参数不能小于0

    while(p!=NULL&&i<j)//j大于链表长度的情况下p指向的是最后一个元素

    {

        p=p->next;

        i++;

    }

    return p;

}

void InsertNode(PtrNode p, char newName[32])//将name值为newName的新结点插入到p的当前位置,p自动后移

{

    PtrNode s = (PtrNode)malloc(sizeof(Node));

    strcpy(s->name, newName);

    s->next = p->next;

    p->next = s;

}

void DeleteNode(PtrNode p)//删除结点p

{

    PtrNode s=p->next;//暂存p的next值

    if(s!=NULL)

    {

        p->next = s->next;

        free(s);//销毁这个结点

    }

}

void DestroyList(PtrNode *ls)//销毁链表ls

{

    PtrNode p = *ls, q;

    while(p!=NULL)//用p遍历ls,依次销毁ls的每一个结点

    {

        q = p;

        p = p->next;

        free(q);

    }

    *ls = NULL;

}

int GetLength(PtrNode ls)//返回ls的结点个数

{

    PtrNode p=ls->next;

    int i=0;

    while(p!=NULL)

    {

        p=p->next;

        i++;

    }

    return i;

}

void BubbleSort(PtrNode ls)//对链表进行冒泡排序,最终为升序

{

    int i, j, n = GetLength(ls);

    int bFlag=1;

    char tmpName[32];

    PtrNode p, q;

    for(i=0; i<n-1&&bFlag==1; i++)

    {

        bFlag = 0;

        p = ls->next;

        for(j=0; j<n-1-i; j++)

        {

            q = p->next;

            if(strcmp(p->name, q->name)>0)//strcmp:比较英文字符串大小,参数1大于参数2时执行if内的语句

            {         //百度百科:strcmp

                strcpy(tmpName, p->name);

                strcpy(p->name, q->name);

                strcpy(q->name, tmpName);//对调p和q的name值

                bFlag = 1;

            }

            p = p->next;

        }

    }

} 

//-------------------------------------------

int main()

{

    int n=4;

    PtrNode myLkList, pNode;

    char keyName[32], newName[32];

    InitList(&myLkList);//初始化

    CreateList(myLkList, n);//插入4个结点

    TraverseList(myLkList);//遍历打印

 printf("请输入要查找的关键字\n");

    scanf("%s", keyName);//输入要查找的keyName

    pNode=LocateElem(myLkList, keyName);//pNode为此keyName的位置下标

    if(pNode!=NULL)//若存在这个keyName就在这个结点的下一个位置插入一个新结点

    {

  printf("请输入要添加的新结点\n");

  scanf("%s", newName);

     InsertNode(pNode, newName);

 }

    TraverseList(myLkList);//遍历打印

    pNode = GetElem(myLkList, 4);//查到到第4个结点

    if(pNode!=NULL)//将此结点之后的统统删除

        DeleteNode(pNode);

 printf("删除第四个以后的结点:\n");

    TraverseList(myLkList);//遍历打印

    return 0;

}

转载于:https://my.oschina.net/SnifferApache/blog/210629

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值