链表的基本操作

来源:互联网 发布:osi的七层网络结构图 编辑:程序博客网 时间:2024/06/06 19:59

c语言的链表的基本操作

// Test.cpp : Defines the entry point for the console application.//#include stdafx.h#include <stdio.h>#include "stdlib.h"//宏定义#define TRUE   1#define FALSE   0#define OK    1#define ERROR   0#define INFEASIBLE -1#define OVERFLOW -2#define LT(a,b)   ((a)<(b))#define N = 100       typedef int Status;typedef int ElemType;typedef struct LNode{    ElemType  data;                 struct LNode   *next;   }LNode, *LinkList;/************************************************************************//*初始化链表*//************************************************************************/Status initList(LinkList &L){    /*单链表的初始化*/    L = (LinkList)malloc(sizeof(LNode));    //申请一个头节点    if(!L) exit(OVERFLOW);          //申请空间失败      L->next=NULL;               //建立一个带都节点的空链表    return OK;    /*     需要改变指针的指针,所以参数必须是引用或者是 *L:    (*L) = (Lnode *)malloc(sizeof(Lnode));    (*L)->next=NULL;    return 1;                                                                         */}/************************************************************************//*     创建链表*//************************************************************************/void createList(LinkList L, int n){    /*单链表的初始化*/    if (!L) {        initList(L);    }    ElemType data;    LinkList p,q = L;    printf("输入节点数据的个数%d:\r\n", n);    for(int i = 0; i<n; i++) {        p = (LinkList) malloc( sizeof(LNode)); //申请一个新节点        scanf("%d",&data);        p->data = data;        p->next = q->next;        q->next = p;        q = p;    }}/************************************************************************//* 在第i位置插入e*//************************************************************************/Status insertList(LinkList L, ElemType e, int i){    LinkList s, p = L;    int j = 0;    while (p && j<i){               //寻找i节点        p = p->next;        j++;    }    if (!p ||j >i) return ERROR;    s = (LinkList) malloc(sizeof(LNode));       //生成新节点    s->data = e; s->next = p->next;         //插入L中    p->next = s;    return OK;}/************************************************************************//* 删除第i位置元素,并用e返回其值                                                                     *//************************************************************************/Status deleteListElem(LinkList L, int i, ElemType &e){    LinkList p, q;    int j = 0;    p = L;    while (p && j<i){        p = p->next;        ++j;    }    if (!p->next || j>i)  return ERROR;   //删除的位置不对    q  = p->next; p->next = q->next;    e = q->data; free(q);           //释放节点    return OK;}/************************************************************************/  /*  插入排序 */  /************************************************************************/  void  InsertSort(LinkList L){    LinkList  list;             /*为原链表剩下用于直接插入排序的节点头指针*/    LinkList  node;             /*插入节点*/    LinkList  p;            LinkList  q;            list = L->next;             /*原链表剩下用于直接插入排序的节点链表*/    L->next = NULL;             /*只含有一个节点的链表的有序链表。*/    while (list != NULL)   {    /*遍历剩下无序的链表*/        node = list, q = L;           while (q && node->data > q->data  ) {            p = q;            q = q->next;        }        if (q == L) {  /*插在第一个节点之前*/            L = node;        }  else {     /*p是q的前驱*/            p->next = node;           }        list = list->next;        node->next = q; /*完成插入动作*/    }}/************************************************************************//* 合并两个线性表*//************************************************************************/void mergeList(LinkList  &La, LinkList  &Lb,  LinkList &Lc){    LinkList pa, pb, pc;    pa  = La->next;    pb  = Lb->next;    Lc =  pc = La;    while (pa && pa) {        if (pa->data > pb->data) {            pc->next = pb;            pc = pb;            pb =pb->next;        }else{            pc->next = pa;            pc = pa;             pa =pa->next;        }    }    pc->next = pa? pa :pb;    free(Lb);}/************************************************************************//* 打印list*//************************************************************************/void printList(LinkList  L){    printf("当前值:");    LinkList p;    p = L->next;    while(p){        printf("%d ", p->data);         p = p->next;    }    printf("\r\n"); }void main(){    LinkList  La,Lb,Lc;    ElemType e;    int init,i;    printf("LA:\r\n");      initList(La);    createList(La, 5);    insertList(La, 7,  3);      printList(La);    deleteListElem(La, 3,  e);      printList(La);    InsertSort(La);    printList(La);    printf("Lb:\r\n");      initList(Lb);    createList(Lb, 4);    InsertSort(Lb);    printList(Lb);    printf("Lc:\r\n");     initList(Lc);    mergeList(La,   Lb,   Lc);    printList(Lc);}