2021-04-27

链表

一、链表的创建

typedef struct node//结构体定义
{
    int data;
    char name[20];
    //数据域
    struct node *next;//地址域
}LNode;

1、尾插法(无返回值)(有头)

void CreateList(LNode *H, int n)//导入链表头和节点个数
{
    LNode *p, *r;//临时节点、尾节点
    int x,i;
    r=H;
    for(i=0;i<n;i++)
    {
   		 p=(LNode *)malloc(sizeof(LNode));//开辟节点
   		 scanf("%d", &p->data);
   		 scanf("%s",p->name);
         p->next=NULL;//将链表尾的地址域赋上NULL
         r->next=p;//链表链接
         r=p;//链表尾的传递
    }
}

2、尾插法(返回值为链表头)(无头)

LNode *createList(int n)//指针函数
{
    LNode *H=NULL,*p,*r;//链表头、临时节点、链表尾
    int i,x;
    for(i=1;i<=n;i++)
    {
    	p=(LNode *)malloc(sizeof(LNode));
       	scanf("%d", &p->data);
        scanf("%s",p->name);
        p->next=NULL;
        if(i==1)
            H=p;//开始时将链表头录入
        else
            r->next=p;//之后链表链接
        r=p;//链表链接
    }
    return H;
}

3、链表输出(无头)

void printList(LNode *h)
{
    LNode *p;
    p=h;
    while(p!=NULL)
    {
        printf("%d %s\n",p->data,p->name);
        p=p->next;
    }
}

4、链表输出(有头)

void PrintList(LNode *h)
{
    LNode *p;
    p=h->next;
    while(p!=NULL)
    {
        printf("%d\n",p->data);
        p=p->next;
    }
}

5、链表节点查找

LNode *findList(LNode *h,int num)
{
    LNode *p;
    p=h;
    while(p!=NULL&&p->data!=num)//注意判断条件为两个
    {
        p=p->next;//遍历
    }
    if(p!=NULL)
        return p;//找到了返回节点地址
    else
        return NULL;//没找到返回NULL
}

6、链表节点删除

void delList(LNode *H,int num)
{
    LNode *b,*r;
    b=H;//要删除节点的前一个节点
    r=H->next;//要删除的节点
    if(r!=NULL)
    {
        while(r!=NULL&&r->data!=num)//循环找要删除的节点
        {
            b=r;
            r=r->next;
        }
        if(r!=NULL)
        {
            b->next=r->next;
            free(r);//不要忘了释放内存
        }
        else
            printf("找不到\n");
    }
}

7、链表节点插入

void insList(LNode *h,LNode *q)
{
    LNode *p,*b;
    p=h->next;//插入右侧节点
    b=h;//插入左侧节点
    if(p!=NULL)//链表内有数据
    {
      while(p!=NULL&&p->data<q->data)//循环找要插入的位置
      {
          b=p;
          p=p->next;
      }
      if(p!=NULL)
      {
          q->next=p;//在中间插入
          b->next=q;
      }
      else
        b->next=q;//在尾部插入
    }
    else//链表内无数据
         b->next=q;

}

老师的代码

#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(LNode)
typedef struct node
{
    int data;
    char name[20];
    struct node *next;
}LNode;

void CreateList(LNode *H, int n)//尾插法
{
    LNode *p, *r;
    int x,i;
    r=H;
    for(i=0;i<n;i++)
    {
        scanf("%d", &x);
        p=(LNode *)malloc(sizeof(LNode));
        p->data=x;
        scanf("%s",p->name);
         p->next=NULL;
        r->next=p;
        r=p;
    }
   // r->next=NULL;
}

void PrintList(LNode *h)
{
    LNode *p;
    p=h->next;
    while(p!=NULL)//?
    {
        printf("%d\n",p->data);
        p=p->next;
    }
}

void Printfile(LNode *h)
{
    LNode *p;
    FILE *fp;
    fp=fopen("c:\\data.txt","w");
    p=h->next;
    while(p!=NULL)//?
    {
        fprintf(fp,"%d %s\n",p->data,p->name);
        p=p->next;
    }
    fclose(fp);
}


void printList(LNode *h)
{
    LNode *p;
    p=h;
    while(p!=NULL)//?
    {
        printf("%d %s\n",p->data,p->name);
        p=p->next;
    }
}

LNode *createList(int n)
{
    LNode *H=NULL,*p,*r;
    int i,x;
    for(i=1;i<=n;i++)
    {
       scanf("%d", &x);
        p=(LNode *)malloc(sizeof(LNode));
        p->data=x;
        scanf("%s",p->name);
        p->next=NULL;
        if(i==1)
            H=p;
        else
            r->next=p;
        r=p;
    }
    return H;
}

LNode *findList(LNode *h,int num)
{
    LNode *p;
    p=h;
    while(p!=NULL&&p->data!=num)
    {
        p=p->next;
    }
    if(p!=NULL)
        return p;
    else
        return NULL        ;
}
void delList(LNode *h,int num)
{
    LNode *b,*p;
    b=h;
    p=h->next;
    if(p!=NULL)
    {
        while(p!=NULL&&p->data!=num)
        {
            b=p;
            p=p->next;
        }
        if(p!=NULL)
        {
            b->next=p->next;
            free(p);
        }
        else
            printf("找不到\n");
    }

}

void insList(LNode *h,LNode *q)
{
    LNode *p,*b;
    p=h->next;
    b=h;
    if(p!=NULL)
    {
      while(p!=NULL&&p->data<q->data)
      {
          b=p;
          p=p->next;
      }
      if(p!=NULL)
      {
          q->next=p;
          b->next=q;
      }
      else
        b->next=q;
    }
    else
         b->next=q;

}

int main()
{
    LNode *Head,*zp,*q;
    int n,num;
    while(scanf("%d", &n)!=EOF)
    {
       /*Head=createList(n);//不带头结点的链表
       printList(Head);
       printf("请输入查找学号\n");
       scanf("%d",&num);
       zp=findList(Head,num);
       if(zp==NULL)
         printf("查无此人\n");
       else
        printf("%d %s\n",zp->data,zp->name);
        */
        Head=(LNode *)malloc(sizeof(LNode));
        printf("%p\n",Head);
        Head->next=NULL;
        CreateList(Head, n);//带头节点
        //PrintList(Head);
        Printfile(Head);
      /*  printf("输入要删除的学号\n");
        scanf("%d",&num);
        delList(Head,num);
        PrintList(Head);

        q=(LNode*)malloc(LEN);
        printf("输入要插入的学号\n");
        scanf("%d %s",&q->data,q->name);
        q->next=NULL;
        insList(Head,q);
        PrintList(Head);

*/
    }
    return 0;
}

/*
3
1001 ZHANG
1002  LIS
1003 WANG
*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>