每日一数据结构与算法——链表

  1 #include <stdio.h>/*单向链表*///不要求逻辑上相邻的两个元素物理上也相邻,通过"链"建立起数据之间的逻辑关系
  2 #include <stdlib.h>
  3 #include<malloc.h>
  4 typedef int ElementType; //需要链表中什么元素,就可以定义为什么类型
  5 typedef struct LNode *List;//把struct Lnode* 重命名为List,
  6 struct LNode
  7 {
  8     ElementType Data; //数据域
  9     List Next; //下一个链表的地址
 10 };
 11 List L;
 12 List MakeEmpty(); //初始化链表
 13 int Length(List L);  // 以遍历链表的方法求链表长度 
 14 List FindKth(int K,List L);  // 按序号查找 
 15 List Find(ElementType X,List L);  // 按值查找 
 16 List Insert(ElementType X,int i,List L);  //将 X 插入到第 i-1(i>0) 个结点之后 
 17 List Delete(int i,List L); // 删除第 i(i>0) 个结点 
 18 void Print(List L); // 输出链表元素 
 19 
 20 List MakeEmpty(){
 21     List L = (List)malloc(sizeof(struct LNode));
 22     L = NULL;
 23     return L;
 24 }
 25 
 26 int Length (List L){
 27     List p = L;
 28     int len = 0;
 29     while(p){ //当p不为空
 30         p = p->Next;
 31         len++;
 32     }
 33     return len;
 34 }
 35 //按序查找
 36 List FindKth(int K, List L){
 37     List p = L;
 38     int i = 1;//从1开始
 39     while(p &&i<K){
 40         p->Next;
 41         i++;
 42     }
 43     if(i == K) //找到了
 44         return p;
 45     else
 46         return NULL;
 47 }
 48 //按值查找
 49 List Find(ElementType X, List L){
 50     List p = L;
 51     while(p&&p->Data!=X)
 52         p = p->Next;
 53     return p; //找到了返回p  找不到,返回NULL,此时P等于NUll
 54 }
 55 /* 插入
 56 1. 用 s 指向一个新的结点
 57 2. 用 p 指向链表的第 i-1 个结点 
 58 3. s->Next = p->Next,将 s 的下一个结点指向 p 的下一个结点 
 59 4. p->Next = s,将 p 的下一结点改为 s   */
 60 List Insert(ElementType X,int i , List L){
 61     List p,s;
 62     if (i == 1){ //新节点插入在表头
 63         s = (List)malloc(sizeof(struct LNode));
 64         s->Data = X;
 65         s->Next = L;
 66         return s;  //插入的节点为头结点
 67     }
 68     p = FindKth(i - 1, L);  //找到弟i-1个节点
 69     if(!p){//第i个节点不存在
 70         printf("节点错误");
 71         return NULL;
 72 
 73     }
 74     else
 75     {
 76         s = (List)malloc(sizeof(struct LNode));
 77         s->Data = X;
 78         s->Next = p->Next; //s的下一个结点指向p的下一个结点
 79         p->Next = s;
 80         return L;
 81     }
 82     
 83 }
 84 /* 删除
 85 1. 用 p 指向链表的第 i-1 个结点 
 86 2. 用 s 指向要被删除的的第 i 个结点
 87 3. p->Next = s->Next,p 指针指向 s 后面
 88 4. free(s),释放空间 
 89 */
 90 List Delete(int i, List L){
 91     List p, s;
 92     if(i==1){ //如果要删除头结点
 93         s = L;
 94         if(L)
 95             L = L->Next;
 96         else
 97             return NULL;
 98         free(s);
 99         return L;
100         }
101         p = FindKth(i - 1, L);//查找第i-1个节点
102         if(!p||!(p->Next)){ //第i或者第i-1个节点不存在
103             printf("节点错误");
104             return NULL;
105         }
106         else
107         {
108             s = p->Next;
109             p->Next = s->Next;
110             free(s);//释放被删除节点
111             return L;
112         }
113         
114 }
115 
116 //输出链表元素
117 void Print(List L){
118     List t;
119     int flag = 1;
120     printf("当前链表为:");
121     for (t = L; t;t=t->Next){
122         printf("%d", t->Data);
123         flag = 0;
124     }
125     if(flag)
126         printf("NULL");
127     printf("\n");
128 }
129 
130 int main(){
131     L = MakeEmpty();
132     Print(L);
133         L = Insert(11,1,L);
134     L = Insert(25,1,L);
135     L = Insert(33,2,L);
136     L = Insert(77,3,L);
137     Print(L);
138     printf("当前链表长度为:%d\n",Length(L));
139     printf("此时链表中第二个结点的值是:%d\n",FindKth(2,L)->Data);
140     printf("查找22是否在该链表中:");
141     if(Find(22,L))
142         printf("是!\n");
143     else
144         printf("否!\n");
145     printf("查找33是否在该链表中:");
146     if(Find(33,L))
147         printf("是!\n");
148     else
149         printf("否!\n");
150     L = Delete(1,L);
151     L = Delete(3,L);
152     printf("----------删除后-----\n"); 
153     Print(L);
154     return 0;
155 }

 

posted on 2020-05-02 09:02  乐乐酱1997  阅读(146)  评论(0)    收藏  举报