C单链表的操作

来源:互联网 发布:网络推广的岗位职责 编辑:程序博客网 时间:2024/06/05 04:34

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

 

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
原创粉丝点击