单链表的插入及销毁

分数 5

作者 李卫明

单位 杭州电子科技大学

1.1编写程序,建立2个带头结点单链表,输入若干整数将正整数插入第1个单链表,将负整数插入第2个单链表,插入前和插入后单链表保持递增或相等次序,显示2个单链表,最后销毁。程序不可存在内存泄漏。

输入格式:

若干整数。

输出格式:

每行显示一个链表,元素间用分隔符->分隔;共两行

输入样例:

100 2 3 -2 -8 -6 -9 -10 50 2 -1

输出样例:

2->2->3->50->100
-10->-9->-8->-6->-2->-1

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

C程序如下:

#include<stdio.h>  
#include<stdlib.h>  
  
typedef struct LinkList {  //定义数据结构
    int Data;  
    struct LinkList *Next;  
} LinkList, *List;  

List  CreatHead();//创建头指针
void Sort(List L);//单链表排序
void Display(List L);//输出单链表
void Destroy(List L);//销毁单链表
void Reverse(List L);

int main() {
 List firstHead, firstTail,secondHead,secondTail;
 firstHead = CreatHead();
 firstTail = firstHead;
 secondHead = CreatHead();
 secondTail = secondHead;
 int v;
 while (scanf("%d", &v) != EOF) {//给单链表添加新结点
     if (v > 0) {//大于0的添加到一个正数链表中
         List L = CreatHead();//创建一个新结点
         L->Data = v;//将v的值赋给L的Data
         firstTail->Next = L;//让正数链表的尾巴指针的Next域指向新结点
         firstTail = L;//尾指针指向新结点
     }
     else {//小于0的添加到另外一个负数链表中
         List L = CreatHead();
         L->Data = v;
         secondTail->Next = L;
         secondTail = L;
     }
 }
    Sort(firstHead);//单链表排序
    Sort(secondHead);
    Display(firstHead);//输出单链表
    Display(secondHead);
    Destroy(firstHead);//销毁单链表
    Destroy(secondHead);
}

  
List CreatHead() {  
    List p = (List)malloc(sizeof(LinkList));  //向内存申请一片空间
    if (p == NULL) {  
        exit(EXIT_FAILURE); // 分配失败时退出  
    }  
    p->Next = NULL;  //新结点的Next域指向NULL
    return p;  //返回p指针所指向的内存地址
}  

void Display(List L) {
    List p = L->Next;  //定义一个p指针指向单链表的第一有效结点
    while (p) {  //如果单链表不为空
        printf("%d", p->Data);  //输出该结点的数据域
        p = p->Next;  //p指针沿着链表继续向后指
        if (p) printf("->");  //如果该节点不为空则输出”->“
    }  //根据题目要求元素间用分隔符”->“分隔
    printf("\n");  //最后输出换行符
}

void Destroy(List L) {  
    List p = L;  //定义一个p指针指向该单链表
    while (p->Next) {  //如果p的Next域不为空,即下一个结点存在
        List q = p->Next;  //定义一个新的指针q指向需要删除的结点
        p->Next = q->Next;  //让头结点与需要删除结点的下一个结点链接
        free(q);  //释放需要删除结点的内存
    }  
    free(p);  //最后删除头结点
}  

void Sort(List L) {//选择排序
    List pStar, pcur,pMin;//定义三个List型指针变量
    pStar = L->Next;//pStar用于指向每次外循环的第一个结点
    int temp;//定义一个零时变量,用于交换Data,注意单链表的排序改变链表顺序,只交换数据域
    for (;pStar != NULL;pStar = pStar->Next) {//外循环,遍历整个单链表
        pMin = pStar;//假设链表中最小的值就是pStar
        for (pcur = pMin->Next;pcur != NULL; pcur = pcur->Next) {//内循环,在篇Star后结点中找最小的数据
            if (pcur->Data < pMin->Data) {//如果后面结点的数据比pMin小,则将其赋值给pMin
                pMin = pcur;
            }
        }
        if (pStar != pMin) {//交换两结点的数据域
            temp = pMin->Data;
            pMin->Data = pStar->Data;
            pStar->Data = temp;
        }//如果pMin的地址与pStar的相等则不需要进行交换
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值