首页 > 代码库 > 链表 创建 插入 删除 查找 合并

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

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

链表创建:

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 =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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);}
View Code

 

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