单链表

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<malloc.h>
  4
  5 typedef int Elemtype;
  6
  7 typedef struct Node{
  8     int data;
  9     struct Node* next;
 10 }Node;
 11
 12 typedef struct Node* LinkList;
 13
 14 void InitLinkList(LinkList *L);
 15 void DestoryList(LinkList* L);
 16 void ClearList(LinkList *L);
 17 void HeadCreateList(LinkList*,int);
 18 void TailCreateList(LinkList*,int);
 19 void DisplayList(LinkList);
 20
 21 //void InitLinkList(Node** L){
 22 //    *L = (LinkList)malloc(sizeof(struct Node));
 23 //    (*L)->next = NULL;
 24 //    //alternation
 25 //}
 26 void InitList(LinkList *L){
 27     *L = (LinkList)malloc(sizeof(struct Node));
 28     (*L)->next = NULL;
 29 }
 30 void DestoryList(LinkList* L){
 31 /*
 32     LinkList p = *L,q;
 33     printf("%d %d\n",p,*L); //p == *L == 7279912
 34     while(p){
 35         q = p->next;
 36         free(p);
 37         p = q;           //last step p = NULL
 38     }
 39     printf("%d %d",p,*L);  //p = 0;*L = 7279912
 40     free(*L);
 41     printf("%d ",*L);      //*L = 7279912
 42 analise the reason for error by the result of "printf"
 43 free(p) is release the block of memory pointed by P,
 44 dose not change pointer p itself.  NULL == 0
 45 */
 46     LinkList q;
 47     while(*L){
 48         q = (*L)->next;
 49         free(*L);
 50         *L = q;
 51     }
 52 }
 53 void ClearList(LinkList *L){
 54     //ClearList(&L);
 55 //    LinkList p = *L;
 56 //    LinkList q;
 57 //
 58 //    TailCreateList(&L,4);
 59 //    DisplayList(L);
 60 //    ClearList(&L);
 61 //    TailCreateList(&L,4);
 62
 63     LinkList p = (*L)->next;
 64     LinkList q;
 65     while(p){
 66         q = p -> next;
 67         free(p);
 68         p = q;
 69     }
 70     (*L)->next = NULL;
 71     printf("LinkList has been clear!\n");
 72 }
 73 void ListEmpty(LinkList L){
 74     if(L->next == NULL)
 75         printf("List empty!\n");
 76     else
 77         printf("Exit Element in List\n");
 78 }
 79 int ListLength(LinkList L){
 80     LinkList p = L->next;
 81     int count = 0;
 82     while(p){
 83         count+=1;
 84         p = p->next;
 85     }
 86     return count;
 87 }
 88 int GetElem(LinkList L,int index){
 89     int count = ListLength(L);
 90     if(index < 1 || index > count+1){
 91         printf("index error!\n");
 92         exit(1);
 93     }
 94     int j = 0;
 95     while(j<index){
 96         L = L->next;
 97         j++;
 98     }
 99     return L->data;
100 }
101 void GetPriorElem(LinkList L,int current_elem,int *priorElement){
102 /*
103     LinkList p = L->next;
104     LinkList q;
105     if(p == NULL){
106         printf("List is Empty!\n");
107         exit(1);
108     }
109     if(p->data == current_elem){
110         printf("the current element is first!\n");
111         exit(1);
112     }
113     q = p->next;
114     while(q && q->data != current_elem){
115         p = q;q = q->next;
116     }
117     if(q == NULL){
118         printf("there is no current in List!\n");
119         exit(1);
120     }
121     else
122         *priorElement = p->data;
123 */
124 /*
125 the promise of the following code is that the
126 current_element is not the first element of the
127 list and does not consider the case of the list
128 for NULL
129 */
130     LinkList p = L->next; //p point first node
131     LinkList q;
132     while(p->next){
133         q = p->next;
134         if(q->data == current_elem){
135             *priorElement = p->data;
136             break;
137         }
138         p = q;
139     }
140     if(p->next == NULL)
141         printf("there is no current_element in List\n");
142 }
143 void GetNextElem(LinkList L,int current_elem,int* next_elem){
144     LinkList p = L->next;
145     LinkList q;
146     if(p == NULL){
147         printf("List is Empty!\n");
148         exit(1);
149     }
150     while(p->next){
151         q = p->next;
152         if(p->data == current_elem){
153             *next_elem = q->data;
154             return;
155         }
156         p = q;
157     }
158     printf("GetNextElement is Failed!\n");
159 }
160 void HeadCreateList(LinkList* L,int n){
161     LinkList s;
162     int i;
163     int e;
164     for(i = 1;i <= n; i++){
165         printf("enter %d integer: ",i);
166         scanf("%d",&e);
167         s = (LinkList)malloc(sizeof(struct Node));
168         s->data = e;
169         s->next = (*L)->next;
170         (*L)->next = s;
171     }
172     printf("\n");
173 }
174 void TailCreateList(LinkList* L,int n){
175     LinkList tail = *L;
176     LinkList s;
177     int i;
178     int e;
179     for(i = 1;i <= n; i++){
180         printf("enter %d integer: ",i);
181         scanf("%d",&e);
182         s = (LinkList)malloc(sizeof(struct Node));
183         s->data = e;
184         tail->next = s;
185         s->next = NULL;
186         tail = s;
187     }
188     printf("\n");
189 }
190 void ListInsert(LinkList* L,int index,int e){
191 /*
192 //insert element before index
193     LinkList q;
194     LinkList p = *L;
195     LinkList s;
196     int count = 0;
197     while(p->next){
198         q = p->next;
199         count += 1;
200         if(count == index){
201             s = (LinkList)malloc(sizeof(struct Node));
202             s -> data = e;
203             p->next = s;
204             s->next = q;
205             break;
206         }
207         p = q;
208     }
209     if(p->next == NULL){
210         printf("InsertList Index Error!\n");
211     }
212 */
213 //options
214     LinkList p = *L;
215     LinkList s;
216     int count = 0;
217     while(p && count<index-1){
218         p = p->next;
219         count += 1;
220     }
221     if(p){
222         s = (LinkList)malloc(sizeof(struct Node));
223         s->data = e;
224         s->next = p->next;
225         p->next = s;
226     }
227     if(p == NULL){
228         printf("InsertList Index Error!\n");
229     }
230 }
231 void ListDelete(LinkList *L,int index,int* e){
232     LinkList p = *L;
233     int count = 0;
234     while(p && count < index - 1){
235         p = p->next;
236         count += 1;
237     }
238     if(p){
239         if(p->next){
240             *e = p->next->data;
241             p->next = p->next->next;
242         }
243         else
244             printf("DeleteList Index Error\n");
245     }
246     if(p == NULL)
247         printf("DeleteList Index Error\n");
248 }
249 void DisplayList(LinkList L){
250     if(L == NULL){
251         printf("List has been destory!");
252         exit(1);
253     }
254     LinkList p = L;
255     while(p -> next){
256         printf("%d ",p->next->data);
257         p = p->next;
258     }
259     printf("\n********displayList executed!\n");
260 }
261 void main(){
262     Node L;
263     LinkList L1 = &L;
264     InitLinkList(&L1);
265
266     LinkList L;
267     InitList(&L);
268     TailCreateList(&L,4);
269     DisplayList(L);
270     ClearList(&L);
271     DisplayList(L);
272     ClearList(&L);
273     DisplayList(L);
274     DestoryList(&L);
275     DisplayList(L);
276
277     ClearList(&L);
278     ListEmpty(L);
279     TailCreateList(&L,5);
280     ListEmpty(L);
281     printf("count of List is: %d\n",ListLength(L));
282     DisplayList(L);
283     printf("getelement index=6 is : %d\n",GetElem(L,6));
284     int r1;
285     GetPriorElem(L,3,&r1);
286     printf("the result of GetPriorElement(3) is: %d\n",r2);
287
288     int r2;
289     GetNextElem(L,3,&r2);
290     printf("the result of GetNextElement(3) is: %d\n",r2);
291     ListInsert(&L,5,999);
292     int r3;
293     ListDelete(&L,5,&r3);
294     printf("execute ListDelete index=5 is %d\n",r3);
295     DisplayList(L);
296 }
时间: 2024-11-03 20:52:00

单链表的相关文章

单链表逆置

重写单链表逆置,熟能生巧- #include <iostream> #include <cstdlib> using namespace std; typedef struct List{ int num; struct List *next; }ListNode,*pListNode; void display(ListNode *pHead) { while(pHead) { cout<<pHead->num<<"--"; pH

02 单链表

线性表之链式存储---单链表 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 // 数据结构 6 typedef struct node 7 { 8 int data; 9 struct node *next; 10 }linkList; 11 12 // 创建单链表,并初始化 13 linkList *linkList_init(void) 14 { 15 linkList *l

(单链表)单链表的整体逆序和局部逆序

题目一:将单链表翻转. 思路:有三种方式. 一:用数组存储单链表的值,然后重新逆序赋值,效率较低. 二:利用三个指针,在原来的基础上进行逆序.这种方法比较实用,效率也高. 三:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾.需要新建一个链表,这种方法和第二种差不多. 这里我就写出第二种方法,比较实用. 代码(方法二): struct ListNode { int val; ListNode *next; ListNode(int x) :

[c语言]单链表的实现

一.基础知识:链表(线性表的链式存储结构) (1)特点:逻辑关系相邻,物理位置不一定相邻. (2)分类: a.不带头节点 b.带头节点 (3)单链表的存储结构: typedef struct SListNode {  DataType data;  struct SListNode* next; }SListNode; 二.代码实现(因避开使用二级指针,所以代码中使用了c++中的引用):此处构造的为不带头节点的链表 (1)sList.h   #pragma once typedef int Da

单链表基本操作

//头文件 #pragma once #include <stdio.h> #include <assert.h> #include <malloc.h> #include <stdlib.h> typedef int DateType; typedef struct LinkNode {  DateType _data;  struct  LinkNode* _next; } LinkNode; void PrintList(LinkNode* pHead

C++单链表的创建与操作

链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素.链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点.Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地址),表示链表的结束.可以看出链表结构必须利用指针才能实现,即一个结点中必须包含一个指针变量,用来存放下一个结点的地址.结点中只有一个next指针的链表称为单链表,这是最简单的链表结构. 首先定义一个

每日一题3:判断单链表是否相交

由于单链表的特殊性,如果某一链表与另一链表相交,那么从相交的节点开始,以后两个链表的每个节点都相同,因此判断两个链表是否相交,只需判断每条链表的最后一个节点是否相同即可! #include "stdafx.h" #include <iostream> using namespace std; struct list_node { int data; list_node* next; }; list_node* CreateList(int datas[],int n) {

数据结构上机测试2-1:单链表操作A (顺序建表+关键字删除)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

大话数据结构---单链表

单链表在存储结构上与顺序存储的区别:不用开辟连续的存储空间,存储位置任意,只需要让数据的前驱知道它的位置就可以,而使用单链表示只需要知道单链表的第一个元素就能找到其他所有的元素,为了方便 一般会设置一个头指针指向第一个元素. 单链表的数据读取:通过头指针一个一个往后遍历 单链表的插入: 删除: 自定义单链表的简单实现: package com.neuedu.entity; /* * 项目名称:JavaSqList * @author:wzc * @date 创建时间:2017年9月2日 上午9:

数据结构(三)之单链表反向查找

一.反向查找单链表 1.简单查找 先遍历获取单链表单长度n,然后通过计算得到倒数第k个元素的下标为n-k,然后查找下标为n-k的元素. 2.优化查找 先找到下标为k的元素为记录点p1,然后设置新的记录点p2的下标从0开始,同时遍历两个记录点,直到p1的值为null,p2是倒数第k个元素. 单链表结点: package cn.edu.scau.mk; /** * * @author MK * @param <T> */ public class Node<T> { private T