C语言数据结构_链表实例分析

编写一个程序,要求:从终端输入一组整数(大于10个数),以0作为结束标志,将这一组整数存放在一个链表中(结束标志0不包括在内),打印出该链表中的值。然后删除该链表中的第5个元素,打印出删除后的结果。最后再内存中释放掉改内存。

#include "stdio.h"

typedef int ElemType;

typedef struct node{
    ElemType data;      //数据域
    struct node *next;      //指针域
}LNode, *LinkList;

LinkList GreatLinkList(int n){
    //创建一个链表,包含n个结点
    LinkList p, r, list=NULL;
    ElemType e;
    int i;
    for(i=1; i<=n; i++){
        scanf("%d", &e);            //输入结点的内容
        p=(LinkList)malloc(sizeof(LNode));      //为新建的结点开辟内存空间
        p->data=e;                      //元素赋值
        p->next=NULL;
        if(!list)
            list=p;                 //赋值链表头指针
        else
            r->next=p;              //将结点连入链表
        r=p;
    }
    return list;                    //返回链表头指针
}

void insertList(LinkList *list, LinkList q, ElemType e){
    //向链表中插入结点
    LinkList p;
    p=( LinkList)malloc(sizeof(LNode) );        //为新建的结点开辟内存空间
    p->data=e;                      //元素赋值
    if(!*list){
        *list=p;
        p->next=NULL;
    }
    else {                           //将结点连入链表
        p->next=q->next;
        q->next=p;
    }
}


void delLink(LinkList *list, LinkList q) {
    //删除链表的某结点
    LinkList r;
    if(q==list){                        //如果删除第一个结点
        *list=q->next;
        free(q);
    }
    else{
        for(r=*list; r->next != q; r=r->next);
        if(r->next != NULL){
            r->next=q->next;
            free(q);
        }
    }
}

void destroyLinkList(LinkList *list){
    //销毁一个链表
    LinkList p, q;
    p= *list;
    while(p) {
        //循环释放掉每一个链表结点
        q=p->next;
        free(p);
        p=q;
    }
    *list=NULL;
}

main()
{
    int e, i;
    LinkList l, q;
    q=l=GreatLinkList(i);       //创建一个链表结点,q和l指向该结点
    scanf("%d", &e);
    while(e)            //循环地输入数据,同时插入新生成的结点
    {
        insertList(&l, q, e);
        q=q->next;
        scanf("%d", &e);
    }
    q=l;
    printf("The content of the linklist\n");
    while(q)                    //输出链表中的内容
    {
        printf("%d ", q->data);
        q=q->next;
    }
    q=l;
    printf("\nDelete the fifth element\n");
    for(i=0; i<4; i++)          //将指针q指向链表的第5个元素
    {
        q=q->next;
    }
    delLink(&l, q);     //删除q所指的结点
    q=l;
    while(q)            //打印出删除后的结果
    {
        printf("%d ", q->data);
        q=q->next;
    }
    destroyLinkList(&l);            //释放掉该链表
    getche();				//该函数一般在Linux中使用
}

程序内容:

1、应用函数GreatLinkList()创建一个只含有1个结点的链表,并向该结点中输入数据

2、然后通过函数insertList()向链表中插入新的结点,在插入结点的同时插入数据,直到输入0为止。数据从键盘输入

3、然后打印出该链表中的数据。再通过循环使指针q指向该链表的第5个元素,调用函数delLink()删除q所指的结点,打印出删除元素后链表中的值。

4、最后调用destroyLinkList()函数释放掉链表所占据的内存空间。

上一篇:数据结构 - >单链表


下一篇:C语言数据结构_创建链表与销毁链表