数据结构-线性表-单链表

#include <stdio.h>
#include <stdlib.h>

/*结构体的定义和数序表的定义*/
typedef int ElemType;
typedef struct Node
{
    ElemType data;
    struct Node *next;

}Node;
/*函数的声明*/
void InitNode(Node *h);
int AddNode(Node *h,ElemType e);
void DeleteNode(Node *s,int n);
void ChangeNode(Node *s,int n,ElemType e);
void InquireNode(Node *s,ElemType e);
void ShowNode(Node *s);
int main(void)
{
    Node f;
    InitNode(&f);
    AddNode(&f,5);
    AddNode(&f,8);
    AddNode(&f,6);
    AddNode(&f,123);
    AddNode(&f,24);
    AddNode(&f,66);
    ShowNode(&f);
    ChangeNode(&f,2,8888);
    InquireNode(&f,8888);
	return 0;
}
/*链表的初始化*/
void InitNode(Node *h)
{
    h->data =0;                        //使用这个方式而不是使用书上的那种方式是因为书上的那种在新增节点的时候会出现问题
    h->next = 0;
    printf("Initialize data is right!\n");
}
/*增加一个链表节点*/
int AddNode(Node *h,ElemType e)
{
    Node *f,*p;
    f=h;
    p = (Node *)malloc(sizeof(Node));    //申请一个新节点
    p->next = 0;                         //新节点初始化
    p->data = e;
    while(f->next)                       //指针滑到最后一个节点
    {
        f = f->next;
    }
    f->next = p;                         //最后一个节点指向新申请的节点
    printf("add data %d is right!\n",e);
    return 1;
}
/*删除一个节点*/
void DeleteNode(Node *s,int n)
{
    Node *f=s,*temp;
    int i=0;
    for(;i<n-1;i++)
    {
        f = f->next;
    }
    temp = ((f->next)->next);
    free(f->next);
    f->next = temp;                    //注意释放内存的时间应该在指针被覆盖前
    printf("\nfinish delete %d Node\n",n);
}
/*更改一个节点的数据*/
void ChangeNode(Node *s,int n,ElemType e)
{
    Node *f = s;
    int i=0;
    for(;i<n;i++)
        f = f->next;
    f->data  =e;
    printf("\nchange the data is right,the new Node is below:\n");
    ShowNode(s);
}
/*查询一个数据*/
void InquireNode(Node *s,ElemType e)
{
    Node *p=s;
    int n=0,ss=0;
    while(p->next)
    {
        if(p->data == e)
        {
            printf("\ndata is in node%d\n",n);
            ss++;
        }
        p = p->next;
        n++;
    }
    if(ss == 0)
        printf("\nno data in Node!\n");
}
/*展示链表中的数据*/
void ShowNode(Node *s)
{
    Node *p=s;
    p = p->next;          // 头节点不存数据
    printf("\nThe data is shown below:\n");
    while(p->next)
    {
        printf("%d\t",p->data);
        p = p->next;
    }
    printf("%d",p->data);
}
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct node{
    ElemType data;
    struct node *next;
}linkNode;
int initLinkNode(linkNode *p);
int linkNodeAdd(linkNode *p,ElemType e);
int insertNode(linkNode *p,ElemType e,int n);
int LinkNodeDel(linkNode *p,int n);
int linkNodePop(linkNode *p);
int getLenght(linkNode *L);
int isInNode(linkNode *L,ElemType e);
int printNode(linkNode *p);
int main()
{
    linkNode L;
    initLinkNode(&L);
    //增加节点的测试
    linkNodeAdd(&L,11);
    linkNodeAdd(&L,12);
    linkNodeAdd(&L,13);
    linkNodeAdd(&L,14);
    printNode(&L);
    //删除中间节点的测试
    LinkNodeDel(&L,3);
    printNode(&L);
    //删除最后的节点的测试
    linkNodePop(&L);
    printNode(&L);
    //插入节点测试
    insertNode(&L,99,2);
    printNode(&L);
    //求长度测试
    int sum = getLenght(&L);
    printf("长度为:%d\n",sum);
    //是否在链表中的测试
    int is = isInNode(&L,13);
    if(is == 1){
        printf("is in node\n");
    }
    else
        printf("not in node\n");
    return 0;
}
int initLinkNode(linkNode *p){
    p->data = 0;
    p->next = NULL;
    return 1;
}
/**
*尾部增加节点
*/
int linkNodeAdd(linkNode *p,ElemType e){
    linkNode *L,*r = p;
    //申请新的节点
    L = (linkNode *)malloc(sizeof(linkNode));
    L->data = e;
    L->next = NULL;
    //链表滑动到尾部
    while(r->next){
        r = r->next;
    }
    //尾部添加新节点
    r->next = L;
    printf("add %d is ok!\n",e);
    return 1;
}
/**
*插入节点
*/
int insertNode(linkNode *p,ElemType e,int n){
    linkNode *L = p,*temp,*new1;
    int i=0;
    for(;i<n-1;i++){
        L = L->next;
    }
    temp = L->next;
    //申请新节点
    new1 = (linkNode *)malloc(sizeof(linkNode));
    new1->data = e;
    new1->next = temp;
    L->next = new1;
    printf("insert %d is ok!\n",e);
    return 1;
}
/**
*尾部删除节点
*/
int linkNodePop(linkNode *p){
    linkNode *L = p;
    while((L->next)->next){
        L = L->next;
    }
    L->next = NULL;
    return 1;
}
/**
*定点删除节点
*/
int LinkNodeDel(linkNode *p,int n){
    linkNode *f = p,*temp;
    int i=0;
    for(;i<n-1;i++){
        f = f->next;
    }
    temp = f->next;
    f->next = temp->next;
    free(temp);
    return 1;
}
/**
*遍历单链表
*/
int printNode(linkNode *p){
    linkNode *L = p;
    L = L->next;
    printf("下面开始遍历整个单链表:\n");
    while(L->next){
        printf("%d-",L->data);
        L = L->next;
    }
    printf("%d\n",L->data);
    return 1;
}
/**
*求单链表长度
*/
int getLenght(linkNode *L){
    linkNode *p = L;
    int sum=0;
    while(p->next){
        sum++;
        p = p->next;
    }
    return sum;
}
/**
*判断数据是否在链表中
*/
int isInNode(linkNode *p,ElemType e){
    linkNode *L=p;
    L = L->next;
    while(L->next){
        if(L->data == e){
            return 1;
        }
        L = L->next;
    }
    if(L->data == e){
        return 1;
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值