单链表
指针大法好
真正到学习数据结构的时候才发现自己对指针的特性理解得非常肤浅,在真正使用链表的时候卡了很久
核心
增
1 2 3 4
| p=(Link*)malloc(sizeof (Link)); p->data=*data++; p->next=L->next; L->next=p;
|
删
1 2 3 4
| Link *q; q=p->next; p->next=q->next; free(q);
|
查
插
1 2 3 4 5
| Link *s; s=(Link*)malloc(sizeof(Link)); s->data=e; s->next=p->next; p->next=s;
|
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| #include <stdio.h> #include <stdlib.h>
typedef char Elemtype;
struct Node{ Elemtype data; struct Node *next; };
typedef struct Node Link;
Link **head; Link **tail;
void d_CreateLink(Link **L,Elemtype data[],int n){ Link *p; int i; *L=(Link *)malloc(sizeof (Link)); (*L)->next=NULL; for (i = 0; i < n; ++i) { p=(Link*)malloc(sizeof (Link)); p->data=*data++; p->next=(*L)->next; (*L)->next=p; } }
void CreateLink(Link **L,Elemtype data[],int n) { Link *p,*r; int i; *L=(Link *)malloc(sizeof (Link)); r=*L; for (i = 0; i < n; i++) { p=(Link*)malloc(sizeof (Link)); p->data=*data++; r->next=p; r=p; } r->next=NULL; }
void AddLink(Link **L,Elemtype data[],int n) { Link *p,*r; int i; if (tail!=NULL){ r=*tail; }else { *L=(Link *)malloc(sizeof (Link)); r=*L; } for (i = 0; i < n; i++) { p=(Link*)malloc(sizeof (Link)); p->data=*data++; r->next=p; r=p; } r->next=NULL; *tail=r; }
Elemtype GetElem(Link *L,int i,Elemtype e){ int j; Link *p; p=L->next; j=1; while (p&&j<i){ p=p->next; j++; } if (!p||j>i){ return -1; } e=p->data; return e; }
void InsertElem(Link *L,int i,Elemtype e) { int j; Link *p,*s; p=L; j=1; while (p&&j<i){ p=p->next; ++j; } if (!p||j>i) { return; } s=(Link*)malloc(sizeof(Link)); s->data=e; s->next=p->next; p->next=s; }
Elemtype DeleteElem(Link *L,int i,Elemtype e){ int j; Link *p,*q; p=L; j=1; while (p->next&&j<i){ p=p->next; j++; } if (!(p->next)||j>i){ return -1; } q=p->next; p->next=q->next; free(q); return e; }
|