xian xian biao

来源:互联网 发布:mac 以太网网络修复 编辑:程序博客网 时间:2024/05/01 07:07
#include"stdio.h"#include<malloc.h>typedef char ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LinkList;void CreatListF(LinkList *&L,ElemType a[],int n)  //头插法建表{ LinkList *s;int i; L=(LinkList *)malloc(sizeof(LinkList)); L->next=NULL; for(i=0;i<n;i++) {  s=(LinkList *)malloc(sizeof(LinkList));  s->data=a[i];  s->next=L->next;  L->next=s; }}void CreateListR(LinkList *&L,ElemType a[],int n)   //尾插法建表{ LinkList *s,*r;int i; L=(LinkList *)malloc(sizeof(LinkList)); r=L; for(i=0;i<n;i++) {  s=(LinkList *)malloc(sizeof(LinkList));  s->data=a[i];  r->next=s;  r=s; } r->next=NULL;}void InitList(LinkList *&L)    //初始化线性表{ L=(LinkList *)malloc(sizeof(LinkList)); L->next=NULL;}void DestroyList(LinkList *&L)     //销毁线性表{ LinkList *p=L,*q=p->next; while(q!=NULL) {  free(p);  p=q;  q=p->next; } free(p);}int ListEmpty(LinkList *L)    //判断线性表是否为空{ return(L->next==NULL);}int ListLength(LinkList *L)    //求线性表的长度{ LinkList *p=L;int n=0; while(p->next!=NULL) {  n++;p=p->next; } return(n);}void DispList(LinkList *L)   //输出线性表{ LinkList *p=L->next; while(p!=NULL) {  printf("%c",p->data);  p=p->next; }}int GetElem(LinkList *L,int i,ElemType &e)   //求线性表中某个数据元素值{ int j=0; LinkList *p=L; while(j<i&&p!=NULL) {  j++;p=p->next; } if(p==NULL)  return 0; else {  e=p->data;return 1; }}int LocateElem(LinkList *L,ElemType e)    //按元素值查找{ LinkList *p=L->next; int i=1; while(p!=NULL&&p->data!=e) {  p=p->next;i++; } if(p==NULL)return(0); else return(i);}int ListInsert(LinkList *&L,int i,ElemType e)   //插入数据元素{ int j=0; LinkList *p=L,*s; while(j<i-1&&p!=NULL) {  j++;p=p->next; } if(p==NULL)return 0; else {  s=(LinkList *)malloc(sizeof(LinkList));  s->data=e; s->next=p->next; p->next=s;  return 1; }}int ListDelete(LinkList *&L,int i,ElemType &e)  //删除数据元素{ int j=0; LinkList *p=L,*q; while(j<i-1&&p!=NULL) {  j++;p=p->next; } if(p==NULL)  return 0; else {  q=p->next;  if(q==NULL)return 0;  e=q->data;  p->next=q->next;  free(q);  return 1; }}int main(){ ElemType e,a[5]={'a','b','c','d','e'}; LinkList *h; InitList(h);                                //初始化顺序表h CreateListR(h,&a[0],5);                     //依次采用尾插入法插入a,b,c,d,e元素 printf("单链表为:");  DispList(h);  printf("\n");                 //输出顺序表h printf("该单链表的长度为:");  printf("%d",ListLength(h)); printf("\n");   //输出顺序表h的长度 if(ListEmpty(h)) printf("该单链表为空。\n");    else printf("该单链表不为空。\n");          //判断顺序表h是否为空 GetElem(h,3,e);printf("该单链表的第3个元素为:");  printf("%c",e); printf("\n");               //输出顺序表h的第3个元素 printf("该单链表中a的位置为:");  printf("%d",LocateElem(h,'a')); printf("\n");  //输出元素'a'的位置 ListInsert(h,4,'f');                        //在第4个元素位置插入'f'素 printf("在第4 个元素位置上插入'f'后单链表为:");  DispList(h); printf("\n");               //输出顺序表h ListDelete(h,3,e);                           //删除L的第3个元素 printf("删除第3个元素后单链表为:"); DispList(h); printf("\n");               //输出顺序表h DestroyList(h);                             //释放顺序表h return 0;}
-----------------------------------------------------------------------------------------
  1. #include "stdafx.h"  
  2. #include <stdio.h>  
  3. #include "stdlib.h"  
  4. //宏定义  
  5. #define TRUE   1  
  6. #define FALSE   0  
  7. #define OK    1  
  8. #define ERROR   0  
  9. #define INFEASIBLE -1  
  10. #define OVERFLOW -2  
  11.   
  12. #define LT(a,b)   ((a)<(b))  
  13. #define N = 100         
  14.   
  15. #define LIST_INIT_SIZE 100 //线性表初始空间分配量  
  16. #define LISTINCREMENT   10 //线性表空间分配的增量  
  17.   
  18. typedef int Status;  
  19. typedef int ElemType;  
  20.   
  21. typedef struct LNode{  
  22.     ElemType  *elem;        //存储空间的基地址  
  23.     int      lenght;        //当前的长度  
  24.     int      listsize;      //当前分配的存储容量  
  25. }SqList;  
  26.   
  27. /** 
  28.  *构造空的线性表 
  29.  */  
  30.   
  31. Status initList(SqList &L, int lenght){  
  32.     if (lenght == 0) lenght = LIST_INIT_SIZE;  
  33.     L.elem = (ElemType *)malloc(lenght * sizeof(ElemType));  
  34.     if(!L.elem) exit(OVERFLOW);  //分配存储空间失败  
  35.     L.lenght = 0;                //初始空表长度为0  
  36.     L.listsize = lenght ;//初始存储容量为100  
  37.     return OK;  
  38. }  
  39. /************************************************************************/  
  40. /* 在第i位置插入e 
  41. */  
  42. /************************************************************************/  
  43. Status insertList(SqList &L, ElemType e, int i){  
  44.     ElemType *p,  *q;  
  45.     if(i<0 ||i > L.lenght) return ERROR;  //i值不合法  
  46.     if (L.lenght >= L.listsize) {  
  47.         ElemType *newbase = (ElemType *)realloc(L.elem ,(L.listsize +LISTINCREMENT)*sizeof(ElemType));  
  48.         if(!newbase) return OVERFLOW;   //存储分配失败    
  49.         L.elem = newbase;               //新基值  
  50.         L.listsize += LISTINCREMENT;    //增加存储容量  
  51.     }  
  52.     q = &L.elem[i];                     //q为插入的位置  
  53.     for (p = &L.elem[L.lenght]; p>=q; --p) {  
  54.         *p = *(p-1);                    //i元素之后的元素往后移动  
  55.     }  
  56.     *q = e;                             //插入e  
  57.     L.lenght +=1;  
  58.     return OK;  
  59.   
  60. }  
  61. /************************************************************************/  
  62. /* 快速排序  
  63. */  
  64. /************************************************************************/  
  65. void sortList(SqList &L){  
  66.       
  67.   
  68. }  
  69. /************************************************************************/  
  70. /* 删除第i位置元素,并用e返回其值                                                                     */  
  71. /************************************************************************/  
  72. Status deleteListElem(SqList &L, int i, ElemType &e){  
  73.     int *p,  *q;  
  74.     if(i<0 ||i > L.lenght) return ERROR;  //i值不合法  
  75.     q = &L.elem[i];                       //被删除元素的位置为i,L.elem就是数组名,  
  76.     e = *q;                               //被删除元素的值赋值给e  
  77.     for (p = q; p< (L.elem + L.lenght); p++){ //元素左移  
  78.         *p = *(p+1);  
  79.     }  
  80.     --L.lenght;  
  81.     return OK;  
  82. }  
  83.   
  84. /************************************************************************/  
  85. /*  快速排序 
  86. */  
  87. /************************************************************************/  
  88.   
  89. int partition(SqList &L, ElemType low, ElemType high){  
  90.     ElemType pivotkey = L.elem[low];               //枢轴记录关键字  
  91.     while (low < high) {                  //从表的两端向中间扫描  
  92.         while (low < high &&  L.elem[high] >= pivotkey ) --high;//高端位置扫描  
  93.         L.elem[low] = L.elem[high];     //交换数据,小于pivotkey移到低端  
  94.         L.elem[high] = pivotkey;  
  95.   
  96.         while (low < high && L.elem[low] <= pivotkey ) ++low;     //低端扫描  
  97.         L.elem[high] = L.elem[low];               //交换数据 大于pivotkey移到高端  
  98.         L.elem[low] = pivotkey;                                   
  99.     }  
  100.     return low;  
  101. }  
  102.   
  103. void quickSort(SqList &L, ElemType low, ElemType high){  
  104.     int pivot;  
  105.     if(low < high) {                                          
  106.         pivot =  partition(L,  low,  high);       
  107.         quickSort(L,  low,  pivot -1);          //低端子表排序  
  108.         quickSort(L,  pivot +1, high);          //高端子表排序  
  109.     }  
  110.       
  111. }  
  112.   
  113.   
  114. /************************************************************************/  
  115. /*  
  116. 合并两个线性表 
  117. */  
  118. /************************************************************************/  
  119.   
  120. void mergeList(SqList La, SqList Lb,  SqList &Lc){  
  121.     ElemType *pa, *pb, *pc;  
  122.     Lc.listsize =  La.lenght + Lb.lenght;  
  123.     initList(Lc, Lc.listsize);          //初始化LC\pc = Lc.elem;  
  124.     Lc.lenght = Lc.listsize;  
  125.     pc = Lc.elem;  
  126.     pa = La.elem;  
  127.     pb = Lb.elem;  
  128.     while (pa <= &La.elem[La.lenght -1] && pb <= &Lb.elem[Lb.lenght -1]){  
  129.         if (*pa <= *pb) *pc++ = *pa++;  
  130.         else *pc++ = *pb++;  
  131.     }  
  132.     while(pa <= &La.elem[La.lenght -1]) *pc++ = *pa++; //插入La的剩余元素  
  133.     while(pb <= &Lb.elem[Lb.lenght -1]) *pc++ = *pb++; //插入Lb的剩余元素  
  134.   
  135. }  
  136.   
  137. /************************************************************************/  
  138. /* 打印list 
  139. */  
  140. /************************************************************************/  
  141. void printList(SqList L){  
  142.     printf("当前值:");   
  143.     for (int i =0; i<L.lenght;i++) {  
  144.         printf("%d ", *(L.elem+i)); // L.elem为首地址  
  145.     }   
  146.     printf("\r\n");   
  147. }  
  148.   
  149. void main()  
  150. {  
  151.     SqList La,Lb,Lc;  
  152.     ElemType e;  
  153.     int init,i;  
  154.     init = initList(La, LIST_INIT_SIZE);  
  155.     int data[6] = {5,3,6,2,7,4};  
  156.     for (i=0; i<6;i++) {  
  157.         insertList(La,  data[i],  i);  
  158.     }  
  159.     printf("LA:\r\n");   
  160.     printList(La);  
  161.     deleteListElem(La, 3, e );  
  162.     printList(La);  
  163.     insertList(La,  e,  3);  
  164.     printList(La);  
  165.   
  166.     //排序  
  167.     quickSort(La,0, La.lenght-1);  
  168.     printList(La);  
  169.   
  170.     printf("LB:\r\n");   
  171.     initList(Lb, LIST_INIT_SIZE);  
  172.     int Bdata[5] = {1,3,2,4,6};  
  173.     for (i=0; i<5;i++) {  
  174.         insertList(Lb,  Bdata[i],  i);  
  175.     }  
  176.     //排序  
  177.     quickSort(Lb,0, Lb.lenght-1);  
  178.     printList(Lb);  
  179.   
  180.     mergeList(La, Lb,  Lc);  
  181.     printList(Lc);  
  182.   
  183. }  

3. 线性表的链表表示LinkedList

一般使用链表来描述。

优点:对于新增和删除操作add和remove和方便。不需要移动元素。

缺点:不方便随机访问元素,LinkedList要移动指针

代码实现:

  1. // Test.cpp : Defines the entry point for the console application.  
  2. //  
  3. #include "stdafx.h"  
  4. #include <stdio.h>  
  5. #include "stdlib.h"  
  6. //宏定义  
  7. #define TRUE   1  
  8. #define FALSE   0  
  9. #define OK    1  
  10. #define ERROR   0  
  11. #define INFEASIBLE -1  
  12. #define OVERFLOW -2  
  13.   
  14. #define LT(a,b)   ((a)<(b))  
  15. #define N = 100         
  16.   
  17. typedef int Status;  
  18. typedef int ElemType;  
  19.   
  20. typedef struct LNode{  
  21.     ElemType  data;               
  22.     struct LNode   *next;     
  23. }LNode, *LinkList;  
  24.   
  25. /************************************************************************/  
  26. /* 
  27. 初始化链表 
  28. */  
  29. /************************************************************************/  
  30. Status initList(LinkList &L){  
  31.     /*单链表的初始化*/  
  32.     L = (LinkList)malloc(sizeof(LNode));    //申请一个头节点  
  33.     if(!L) exit(OVERFLOW);          //申请空间失败    
  34.     L->next=NULL;                //建立一个带都节点的空链表  
  35.     return OK;  
  36.   
  37.     /*  
  38.     需要改变指针的指针,所以参数必须是引用或者是 *L: 
  39.     (*L) = (Lnode *)malloc(sizeof(Lnode)); 
  40.     (*L)->next=NULL; 
  41.     return 1;                                                                      
  42.     */  
  43.   
  44. }  
  45.   
  46. /************************************************************************/  
  47. /*      
  48. 创建链表 
  49. */  
  50. /************************************************************************/  
  51. void createList(LinkList L, int n){  
  52.     /*单链表的初始化*/  
  53.     if (!L) {  
  54.         initList(L);  
  55.     }  
  56.     ElemType data;  
  57.     LinkList p,q = L;  
  58.     printf("输入节点数据的个数%d:\r\n", n);  
  59.     for(int i = 0; i<n; i++) {  
  60.         p = (LinkList) malloc( sizeof(LNode)); //申请一个新节点  
  61.         scanf("%d",&data);  
  62.         p->data = data;  
  63.         p->next = q->next;  
  64.         q->next = p;  
  65.         q = p;  
  66.     }  
  67. }  
  68. /************************************************************************/  
  69. /* 在第i位置插入e 
  70. */  
  71. /************************************************************************/  
  72. Status insertList(LinkList L, ElemType e, int i){  
  73.     LinkList s, p = L;  
  74.     int j = 0;  
  75.     while (p && j<i){                //寻找i节点  
  76.         p = p->next;  
  77.         j++;  
  78.     }  
  79.     if (!p ||j >i) return ERROR;  
  80.     s = (LinkList) malloc(sizeof(LNode));       //生成新节点  
  81.     s->data = e; s->next = p->next;            //插入L中  
  82.     p->next = s;  
  83.     return OK;  
  84.   
  85. }  
  86.   
  87. /************************************************************************/  
  88. /* 删除第i位置元素,并用e返回其值                                                                     */  
  89. /************************************************************************/  
  90. Status deleteListElem(LinkList L, int i, ElemType &e){  
  91.     LinkList p, q;  
  92.     int j = 0;  
  93.     p = L;  
  94.     while (p && j<i){  
  95.         p = p->next;  
  96.         ++j;  
  97.     }  
  98.     if (!p->next || j>i)  return ERROR;   //删除的位置不对  
  99.     q  = p->next; p->next = q->next;  
  100.     e = q->data; free(q);            //释放节点  
  101.     return OK;  
  102. }  
  103.   
  104.   
  105. /************************************************************************/    
  106. /*  插入排序  
  107. */    
  108. /************************************************************************/    
  109.   
  110. void  InsertSort(LinkList L)  
  111. {  
  112.     LinkList  list;             /*为原链表剩下用于直接插入排序的节点头指针*/  
  113.     LinkList  node;             /*插入节点*/  
  114.     LinkList  p;          
  115.     LinkList  q;          
  116.   
  117.     list = L->next;              /*原链表剩下用于直接插入排序的节点链表*/  
  118.     L->next = NULL;              /*只含有一个节点的链表的有序链表。*/  
  119.     while (list != NULL)   {    /*遍历剩下无序的链表*/  
  120.         node = list, q = L;     
  121.         while (q && node->data > q->data  ) {  
  122.             p = q;  
  123.             q = q->next;  
  124.         }  
  125.           
  126.         if (q == L) {  /*插在第一个节点之前*/  
  127.             L = node;  
  128.         }  else {     /*p是q的前驱*/  
  129.             p->next = node;     
  130.         }  
  131.         list = list->next;  
  132.         node->next = q; /*完成插入动作*/  
  133.   
  134.     }  
  135. }  
  136.   
  137.   
  138.   
  139. /************************************************************************/  
  140. /*  
  141. 合并两个线性表 
  142. */  
  143. /************************************************************************/  
  144.   
  145. void mergeList(LinkList  &La, LinkList  &Lb,  LinkList &Lc){  
  146.     LinkList pa, pb, pc;  
  147.     pa  = La->next;  
  148.     pb  = Lb->next;  
  149.     Lc =  pc = La;  
  150.     while (pa && pa) {  
  151.         if (pa->data > pb->data) {  
  152.             pc->next = pb;  
  153.             pc = pb;  
  154.             pb =pb->next;  
  155.         }else{  
  156.             pc->next = pa;  
  157.             pc = pa;   
  158.             pa =pa->next;  
  159.         }  
  160.     }  
  161.     pc->next = pa? pa :pb;  
  162.     free(Lb);  
  163. }  
  164.   
  165. /************************************************************************/  
  166. /* 打印list 
  167. */  
  168. /************************************************************************/  
  169. void printList(LinkList  L){  
  170.     printf("当前值:");  
  171.     LinkList p;  
  172.     p = L->next;  
  173.     while(p){  
  174.         printf("%d ", p->data);   
  175.         p = p->next;  
  176.     }  
  177.     printf("\r\n");   
  178. }  
  179.   
  180. void main()  
  181. {  
  182.     LinkList  La,Lb,Lc;  
  183.     ElemType e;  
  184.     int init,i;  
  185.     printf("LA:\r\n");    
  186.     initList(La);  
  187.     createList(La, 5);  
  188.     insertList(La, 7,  3);    
  189.     printList(La);  
  190.     deleteListElem(La, 3,  e);    
  191.     printList(La);  
  192.     InsertSort(La);  
  193.     printList(La);  
  194.   
  195.     printf("Lb:\r\n");    
  196.     initList(Lb);  
  197.     createList(Lb, 4);  
  198.     InsertSort(Lb);  
  199.     printList(Lb);  
  200.   
  201.     printf("Lc:\r\n");   
  202.     initList(Lc);  
  203.     mergeList(La,   Lb,   Lc);  
  204.     printList(Lc);  
  205.   
  206. }  
0 0