C语言 单链表 相关操作
数据结构 单链表
若有错误还请指出
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct LNode{ //定义单链表结点类型 5 int data; //每个节点存放一个数据元素 6 struct LNode *next; //指针指向下一个结点 7 }LNode,*LinkList; 8 9 //判断不带头结点的单链表是否为空 10 bool Empty1(LinkList L){ 11 return (L==NULL); 12 } 13 14 //初始化不带头结点的单链表 15 bool InitList1(LinkList &L){ 16 L=NULL; //空表,暂时还没有任何节点 17 return true; 18 } 19 20 //判断带头结点的单链表是否为空 21 bool Empty2(LinkList L){ 22 if(L->next ==NULL) 23 return true; 24 else 25 return false; 26 } 27 28 //初始化带头结点的单链表 头结点不存储数据 29 bool InitList2(LinkList &L){ 30 31 L=(LNode *)malloc(sizeof(LNode)); //分配一个头结点 32 if(L==NULL) //内存不足,分配失败 33 return false; 34 L->next = NULL; //头结点之后暂时还没有节点 35 return true; 36 } 37 38 //插入操作(带头结点)(按位) 最好时间复杂度O(1) 最差时间复杂度O(n) 平均时间复杂度O(n) 39 bool ListInsert2(LinkList &L,int i,int e){ 40 if(i<1) 41 return false; 42 LNode *p; //指针p指向当前扫描到的结点 43 int j=0; //当前p指向的是第几个结点,可以把头结点看做是第0个结点 44 p=L; //L指向头结点,头结点是第0个结点,但是不存储数据 45 while(p!=NULL && j<i-1){ //循环找到第i-1个结点 46 p=p->next; 47 j++; 48 } 49 if(p==NULL) //i的值不合法 50 return false; 51 LNode *s = (LNode *)malloc (sizeof(LNode)); 52 s->data=e; 53 s->next=p->next; 54 p->next=s; 55 return true; 56 } 57 58 //插入操作(不带头结点)(按位) 最好时间复杂度O(1) 最差时间复杂度O(n) 平均时间复杂度O(n) 59 bool ListInsert1(LinkList &L,int i,int e){ 60 if(i<1) 61 return false; 62 if(i==1){ //插入第一个结点的操作与其它结点操作不同 63 LNode *s = (LNode *)malloc(sizeof(LNode)); 64 s->data=e; 65 s->next=L; 66 L=s; //头指针指向新结点 67 return true; 68 } 69 LNode *p; //指针p指向当前扫描到的结点 70 int j=1; //当前p指向的是第几个结点 71 p=L; //L指向第一个结点 72 while(p!=NULL && j<i-1){ //循环找到第i-1个结点 73 p=p->next; 74 j++; 75 } 76 if(p==NULL) //i的值不合法 77 return false; 78 LNode *s = (LNode *)malloc (sizeof(LNode)); 79 s->data=e; 80 s->next=p->next; 81 p->next=s; 82 return true; 83 } 84 85 //后插操作:在p结点之后插入元素e O(1) 86 bool InsertNextNode(LNode *p,int e){ 87 88 if (p==NULL) 89 return false; 90 LNode *s = (LNode *)malloc(sizeof(LNode)); 91 if(s==NULL) 92 return false; //内存分配失败 93 s->data=e; //用结点s保存数据元素e 94 s->next=p->next; 95 p->next=s; //将结点s连接到p之后 96 return true; 97 } 98 99 //前插操作:在p结点之前插入元素 O(1) 100 bool InsertPriorNode(LNode *p,int e){ 101 102 if(p==NULL) 103 return false; 104 LNode *s = (LNode *)malloc(sizeof(LNode)); 105 if(s==NULL) 106 return false; //内存分配失败 107 108 s->next=p->next; 109 p->next=s; //新节点s连接到p之后 110 s->data=p->data; //将p中元素复制到s中 111 p->data=e; //p中元素覆盖为e 112 return true; 113 } 114 115 //按位序删除(带头节点) 最好时间复杂度O(1) 最差时间复杂度O(n) 平均时间复杂度O(n) 116 bool ListDelete(LinkList &L,int i,int &e){ 117 118 if(i<1) 119 return false; 120 LNode *p; //指针p指向当前扫描到的结点 121 int j=0; //当前指针p指向的是第几个结点 122 p=L; //L指向头结点 123 124 while(p!=NULL && j<i-1){ //循环找到第i-1个结点 125 p=p->next; 126 j++; 127 } 128 if(p==NULL) 129 return false; 130 if(p->next == NULL) 131 return false; 132 133 LNode *q=p->next; //令Q指向被删除的结点 134 e = q->data; //用e返回元素的值 135 p->next = q->next; //将*q结点从链中断开 136 free(q); //释放结点的存储空间 137 return true; 138 } 139 140 //删除指定结点p 该方法存在问题,若删除最后一个结点会报错,暂时先用着,考试的时候可能会扣一分左右 141 bool DeleteNode(LNode *p){ 142 if(p==NULL) 143 return false; 144 LNode *q=p->next; //令q指向*p的后继结点 145 p->data=p->next->data; //和后继结点交换数据域 146 p->next=q->next; //将*q结点从链中断开 147 free(q); //释放后继结点的存储空间 148 return true; 149 } 150 151 //按位查找 带头结点 152 LNode *GetElem(LinkList L,int i){ 153 154 if(i<0) 155 return NULL; 156 LNode *p; //指针p指向当前扫描到的结点 157 int j=0; //当前p指向的是第几个结点 158 p=L; //L指向头结点 159 while(p!=NULL && j<i){ //循环找到第i个结点 160 p=p->next; 161 j++; 162 } 163 return p; 164 } 165 166 //按值查找 带头结点 167 LNode * LocateElem(LinkList L,int e){ 168 169 LNode *p=L->next; 170 while(p!=NULL && p->data != e) 171 p=p->next; 172 return p; 173 } 174 175 176 int main(){ 177 return 0; 178 }
补充一下头插法和尾插法
1 //尾插法建立单链表 2 LinkList List_TailInsert(LinkList &L){ 3 int x; //结点的data 4 L=(LinkList)malloc(sizeof(LNode)); //建立头结点 5 LNode *s,*r=L; //r为表尾指针 6 scanf("%d",&x); //输入结点的值 7 while(x!=9999){ //输入9999表示结束 8 9 s=(LNode *)malloc(sizeof(LNode)); 10 s->data=x; 11 r->next=s; 12 r=s; 13 scanf("%d",&x); 14 } 15 r->next=NULL; 16 return L; 17 } 18 19 //头插法建立单链表 20 LinkList List_HeadInsert(LinkList &L){ 21 22 LNode *s; 23 int x; 24 L=(LinkList)malloc(sizeof(LNode)); //创建头结点 25 L->next=NULL; //初始为空链表 26 scanf("%d",&x); //输入结点的值 27 while(x!=9999){ 28 29 s=(LNode *)malloc(sizeof(LNode)); //创建新结点 30 s->data=x; 31 s->next=L->next; 32 L->next=s; //将新节点插入表中,L为头指针 33 scanf("%d",&x); 34 } 35 return L; 36 }

浙公网安备 33010602011771号