链表 创建 插入 删除 查找 合并

最近学习了一下单链表的操作,将代码保存如下,供以后查看。

链表创建:

1.先建立一个不含数据的头指针*head,头指针的链接域为NULL。

2.声明一个用于暂存新申请空间的指针*pc,一个用于保存创建的链表的指针*r,令*r指向*head。

3.在循环中,为指针*pc申请空间,并给数据域赋值,head->next = pc, pc->next = NULL, head = pc。

#define _CRT_SECURE_NO_DEPRECATE  /*取消scanf,printf不安全之类的错误提示*/
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int value;
    struct node* next;
}listnode;

listnode* Creat_List1(int nodenum, int *data); //最先进去的元素在最后面
listnode* Creat_List2(int nodenum, int *data); //最先进去的元素在最前面
int Get_Link_Element(listnode* head, int i); //取得头指针为head的链表中的第i个元素的值(包括第0个元素)
void Insert_List(listnode* head, int a, int i);
void Delet_List(listnode* head, int i); //删除第i个元素
listnode* Merge_TWO_Linklist(listnode *list1, listnode *list2);//合并两个有序链表

int main()
{
    int data;
    listnode *linka, *linkb, *linkc, *linkd, *linke;
    linka = (listnode*)malloc(sizeof(listnode));
    linkb = (listnode*)malloc(sizeof(listnode));
    linkc = (listnode*)malloc(sizeof(listnode));
    linkd = (listnode*)malloc(sizeof(listnode));
    linke = (listnode*)malloc(sizeof(listnode));
    int a[5] = { 1, 3, 5, 7, 9 };
    int b[3] = { 2,2, 4 };
    linka = Creat_List2(5, a);
    linkb = Creat_List2(3, b);
    Insert_List(linkb, 10, 1);
    Delet_List(linkb, 1);
    linkc=Merge_TWO_Linklist(linka, linkb);
    data = Get_Link_Element(linkb, 1);
    printf("%d\n", data);
}

//新元素总是插入到头指针后面,结果就是原先的元素一直往后移
listnode* Creat_List1(int nodenum,int *data)
{
    listnode *pc; //保存新节点
    listnode *head;
    head = (listnode*)malloc(sizeof(listnode));
    head->next = NULL; //先建立一个带头结点的单链表
    /*开始插入元素*/
    for (int i = 0; i < nodenum; i++)
    {
        pc = (listnode*)malloc(sizeof(listnode));
        pc->value = data[i];
        pc->next = head->next;
        head->next = pc;
    }
    return head;
}
//新元素插入到头指针后面,头指针一直往后移
listnode* Creat_List2(int nodenum, int *data)
{
    listnode *pc; //保存新节点
    listnode *head;
    listnode *r;//保存产生的链表
    head = (listnode*)malloc(sizeof(listnode));
    head->next = NULL; //先建立一个带头结点的单链表
    r = head;
    /*开始插入元素*/
    for (int i = 0; i < nodenum; i++)
    {
        pc = (listnode*)malloc(sizeof(listnode));
        pc->value = data[i];
        head->next = pc;
        pc->next = NULL;
        head = pc;
    }
    return r;
}

//取得头指针为head的链表中的第i个元素的值(包括第0个元素)
int Get_Link_Element(listnode* head, int i)
{
    /*创建一个扫描指针,让它指向第一个元素*/
    listnode* pc;
    int j = 0; //计数
    pc = (listnode*)malloc(sizeof(listnode));
    pc = head->next;
    while (pc != NULL && j < i) //遍历
    {
        pc = pc->next;
        j++;
    }
    if (pc == NULL || j > i) exit(-1);
    return pc->value;
}

/*
*合并两个有序链表,把list2合并到list1
*/
listnode* Merge_TWO_Linklist(listnode *list1, listnode *list2)
{
    listnode *pc1, *pc2, *pc3,*list3;
    pc1 = (listnode*)malloc(sizeof(listnode));
    pc2 = (listnode*)malloc(sizeof(listnode));
    pc3 = (listnode*)malloc(sizeof(listnode));

    pc1 = list1->next;
    pc2 = list2->next;
    pc3 = list1;
    list3 = pc3;
    while (pc1 != NULL && pc2 != NULL)
    {
        if (pc1->value <= pc2->value) {
            pc3->next = pc1;
            pc3 = pc3->next;
            pc1 = pc1->next;
        }
        else{
            pc3->next = pc2;
            pc3 = pc3->next;
            pc2 = pc2->next;
        }
    }
    if (pc1 == NULL) pc3->next = pc2;
    if (pc2 == NULL) pc3->next = pc1;
    free(list2);
    return list3;
}

void Insert_List(listnode* head, int a, int i)
{
    listnode *pc;
    listnode *s;
    pc = head->next;//令pc指向第一个元素
    int j = 1;
    while (pc != NULL && j < i)
    {
        pc = pc->next; //pc后移动
        j++;
    }
    if (pc == NULL)
    {
        printf("error\n");
        exit(-1);
    }

    s = (listnode*)malloc(sizeof(listnode));
    s->value = a;
    s->next = pc->next;
    pc->next = s;
}

//删除第i个元素
void Delet_List(listnode* head, int i)
{
    listnode *temp = NULL;
    int j = 1; //计数
    head = head->next;
    while (head != NULL && j < i)
    {
        head = head->next;
        j++;
    }
    if (head == NULL)
    {
        printf("error\n");
        exit(-1);
    }
    temp = head->next;
    head->next = temp->next;
    //head = head->next->next;
    free(temp);
}

时间: 2024-10-10 02:10:33

链表 创建 插入 删除 查找 合并的相关文章

[PHP] 数据结构-链表创建-插入-删除-查找的PHP实现

链表获取元素1.声明结点p指向链表第一个结点,j初始化1开始2.j<i,p指向下一结点,因为此时p是指向的p的next,因此不需要等于3.如果到末尾了,p还为null,就是没有查找到 插入元素1.插入元素和查找类似,找到位置后2.生成新的结点s, s->next=p->next p->next=s; 删除元素1.删除元素,找到位置后2.绕过一下,q=p->next p->next=q->next; <?php class Node{ public $data

单链表 初始化 创建 头插法 尾插法 插入 删除 查找 合并 长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(LNode) #

顺序表 初始化 插入 删除 查找 合并 交换 判断为空 求长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define TRUE 1 #define ERROR -1 #define FALSE -1 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(SqList) #define MLC (Li

JavaScript之jQuery-3 jQuery操作DOM(查询、样式操作、遍历节点、创建插入删除、替换、复制)

一.jQuery操作DOM - 查询 html操作 - html(): 读取或修改节点的HTML内容,类似于JavaScript中的innerHTML属性 文本操作 - text(): 读取或修改节点的文本内容,类似于JavaScript中的textContent属性 值操作 - val(): 读取或修改节点的value属性值,类似于 JavaScript 中的value值 属性操作 - attr(): 读取或者修改节点的属性 - removeAttr(): 删除节点的属性 二.jQuery操作

链表创建打印删除

链表创建打印删除:http://wenku.baidu.com/view/d2343df67c1cfad6195fa7d8.html http://bbs.ednchina.com/BLOG_ARTICLE_2143077.HTM http://zhidao.baidu.com/link?url=vdWWhzPcyNykH1NSG-EdhHnPAsmTS6VDSmm-hMZU7GZPi7-w5s-WRpANOCat9y7C5xQHYLjwjPQWeZj9yb_91q http://www.2ct

单链表的插入删除操作(c++实现)

下列代码实现的是单链表的按序插入.链表元素的删除.链表的输出 // mylink.h 代码 #ifndef MYLINK_H #define MYLINK_H #include<iostream> using namespace std; struct node { int data; node *next; }; class list { public: list() { head=NULL; }; void insert(int item); void del(int item); voi

git分支创建分支删除分支合并

本文git版本1.9.6 一.创建分支,删除分支 二.创建分支,合并分支,删除分支 三.创建分支,git 3-way merge,删除分支 git branch 相关命令 git branch # 列出目前有多少branch git branch new-branch # 产生新的branch (名称: new-branch), 若没有特别指定, 会由目前所在的branch / master 直接复制一份. git branch new-branch master # 由master 产生新的b

NetBSD Make源代码阅读三:链表之插入、查找、删除与对每个节点应用函数

1. 插入节点 在指定节点后面插入新的节点.这个函数首先检查参数的有效性.然后分两种情况处理插入: 1> 如果要插入的链表为空,新节点是链表的第一个节点,新初化新节点以后,直接让firstPtr与lastPtr指向这个节点. 2>如果链表中已有其它节点,就改变前后节点的指针,将新节点插入. /*- *----------------------------------------------------------------------- * Lst_InsertAfter -- * 创建新

P330.9 实验报告 创建动态链表实现插入删除

#include<stdio.h> #include<stdlib.h> #define LEN sizeof(struct Student) struct Student {  long num;  char name[20];  int age;  float score;  struct Student *next; }; int n; struct Student *creat() {  struct Student*head; struct Student *p1,*p2