【高级语言程序设计期末复习No.1】动态链表的建立,输出,插入和删除

来源:互联网 发布:中国软件服务市场 编辑:程序博客网 时间:2024/05/22 01:52

为了应对6月16日的期末考试,特推出此专栏博客。

期末考试共五道大题,每题20分,分别考察数组,字符串,结构体,指针,链表。

因为链表本身较为复杂,属于一个难点,但是考察内容不会很复杂,因此首先对链表进行讨论。

以下给出最基本的链表输入输出代码。

例题1:建立一个链表,输入一组不定的数值,当输入0的时候停止输入并在一行输出所有已经输入的数字。

这是最基本的链表输入输出题目。以下给出最基础的代码。

#include <stdio.h>#include <stdlib.h>struct data{    int abc;    struct data * next;} ab;int main(){    struct data *head;    struct data *p1,*p2,*p;    int n=0;    p1=p2=(struct data*)malloc(sizeof(struct data));    scanf("%d",&p1->abc);    head=NULL;    while(p1->abc!=0)    {        n=n+1;        if(n==1)head=p1;        else p2->next=p1;        p2=p1;        p1=(struct data*)malloc(sizeof(struct data));        scanf("%d",&p1->abc);    }    p2->next=NULL;    printf("Hello world!\n");    p=head;    if(head!=NULL)        do        {            printf("%d ",p->abc);            p=p->next;        }        while(p!=NULL);    return 0;}
malloc的头文件来自于stdlib,h文件里,但是本人亲测去掉stdlib头文件也可以正常运行程序。不过仍然建议加上本行头文件。

这个题目我们首先建立了一个结构体,名字叫data,里面包含两个元素,一个整型类型数据abc和一个指针变量。这个指针变量充当的作用就是把各个数据连接在一起形成链表。

接下来我们在主函数里定义了几个结构体指针变量,head,p1,p2,p,其中前三个用于链表的构建,最后一个用于链表的输出。

n用于计数,可以在程序结束的时候尝试输出n,代表输入的数据个数。

接下来就是链表的创建过程。链表的创建过程我们可以理解为p1和p2的移动连接建设。

首先我们开辟一个新单元,利用malloc函数。这个函数的作用就是开辟新单元用于储存数据,在链表中使用格式类似于上面的程序。链表则就是由n个这种单元连接起来的。

其次输入第一个数据。p1->abc则代表p1指向的结构体中的名字为abc的数值。

然后我们让头指针指向NULL,此处的意思是空。

紧接着如果输入的数据不是0,我们开始进行一段循环,来依次输入接下来的数值。在这个循环中,循环进行一次,n就增大1,起到计数的作用。

在这个循环里我们要判断是不是头指针。如果是头指针,我们需要让head指向新开辟的节点,也就是令head=p1。让p2指向p1,保证紧跟p1(p2=p1),然后我们再开辟一个结点让p1指向它,接着输入这个节点的数据。

如果不是头指针,我们就让新结点地址赋给第一个节点的next,因为p2紧随其后,所以也就是p2->next=p1。接着让p2指向刚建立的结点(p2=p1),p1继续开辟新节点,重复循环,直到输入的数据是0。


等到输入的数据为0时结束循环,让p2所在的位置的指针指向null。此时p1已经开辟了新单元,只不过这个单元里值为0,因此不需要连接到链表里。

这样的话链表构建就完成了。

我们在这个位置让电脑输出helloworld来判读a女程序进展到了何种地步。


接下来是输出,输出稍微好理解一些。

让p先等于头指针,只要头指针不为空,也就是第一个数据不是0就输出下面的数据。输出的过程中每次让p指向下一个结点(p=p->next),当p不是空地址就继续循环输出,直到空地址停止输出。


以上就是最基础的链表建立和输出。

例题2:输入num,删除链表中的num数据。

以下给出核心代码,并用注释进行部分解释。(不可以直接运行)

int num;struct data *p1,*p2;p1=head;while(num!=p1->abc&&p1->next!=NULL)//p1指向的不是要找的而且后面还有节点{    p2=p1;    p1=p1->next;//p1后移}if(num==p1->abc){    if(p1==head)head=p1->next;    else p2->next=p1->next;    printf("success");//显示删除成功    n=n-1;//计数减少一个}
例题3:输入num,在已经排好序的链表中进行数据插入。

以下给出核心代码,并用注释进行部分解释。(不可以直接运行)

(机房马上关门,明天再进行补充)

链表的考查方式基本如上所示。之后可能会继续补充链表排序方式。

以上内容为本人原创,第一次写博客,如有内容不周全或者错误的地方,欢迎指正。


阅读全文
1 0
原创粉丝点击