C单链表的操作

单链表的创建、删除结点、插入新结点、遍历但链表。很多不足之处,希望多多提意见改正:

 

1、链表

1)        单链表的创建

首先创建一个节点,将头结点、q临时节点、创建节点p。都指向这个节点。

接下来循环创建链表的每个节点,为了实现人机交互,最好在创建每个节点的时候都询问是否创建节点,创建下一个单独节点结束之后。然后让q的下一个节点指向p这样就建立起了中间链接,然后让q指向p节点。这样依次循环,就创建好了一个单链表。

具体的代码:

struct student *creat_line(void)
{
        struct student *head;
        struct student *p;
        struct student *q;
        char   c[2];
        int    num;
        num     = 0;
        p=(struct student*)malloc(sizeof(struct student));
        if(p!=NULL){
                scanf("%s%d", p->name, &p->num);
        }
        printf("do you want to creat y/n\n");
        scanf("%s", c);
        num++;
        head    = p;
        q       = p;
        do{
                p = p->next;
                p=(struct student*)malloc(sizeof(struct student));
                if(p!=NULL){
                        scanf("%s%d", p->name, &p->num);
                }
                printf("do you want to creat y/n\n");
                scanf("%s", c);
                num++;
                q->next = p;
                q       = p;
        }while(c[0]=='y');
        p       = NULL;
        return head;
}

2)        链表节点的删除

在各种笔试题目中最常见的就是链表节点的删除,其实觉得和很奇怪,为什么总是喜欢考这个呢,感觉好像期末考试一样。

删除节点,其实要分是不是删除头结点的问题,如果是删除头节点,那就直接将头节点的下一个节点视为头节点,然后删除头节点就可以了。

如果不是删除头节点,就先锁定需要删除的节点的前一个节点q,然后将q->next指向p->nextj然后删除p节点。

p->next=q->next;delete q;

具体程序如下:

 struct student *delete_point(struct student *head, int del_num)
 {
         struct student *p;
         struct student *q;
         p       = head;
         if(del_num==head->num){
                 head    = head->next;
         }else{
                 while(p!=NULL){
                         if((p->next)->num==del_num){
                                 q       = p->next;
                                 p->next = q->next;
                                 free(q);
                                 break;
                         }
                         p       = p->next;
                 }
         }
         return head;
 }


New需要删除,如果是malloc就直接free就可以了。

3)        遍历链表

首先是一个节点指向头节点,然后依次指向下一个节点

 void view_line(struct student *head)
 {
         struct student *p;
         p       = head;
         while(p!=NULL){
                 printf("%s %d\n", p->name, p->num);
                 p       =  p->next;
         }
 }

4)        链表节点的插入

插入节点,分在前面插入和在后面插入,这里只是做了在指定节点后面插入新的节点。

先产生一个节点,让新产生的节点指向指定节点的下一个节点,建立连接,然后使得指定节点指向新建的节点,这样就连接起来了,是不是很简单呢!

struct student *insert_point(struct student *head, int insertnum)
{
        struct student *p;
        struct student *q;
        p       = (struct student *)malloc(sizeof(struct student ));
        scanf("%s%d", p->name, &p->num);
        q       = head;
        while(q!=NULL){
                if(q->num==insertnum){
                        q->next = p->next;
                        q->next = p;
                        break;
                }
                q       = q->next;
        }
        return head;
}

源代码下载:http://download.csdn.net/detail/u012789847/9063209

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值