关于链表的C语言实现(初级)

好好努力坚持吧,大概算法什么的,会是能贯穿自己一辈子的事情

链表操作(实验名称)
一、实验目的
掌握链表的基本算法并完成对链表各个功能的实现

二、实验内容
链表的基本运算实现,要求至少具有以下功能:
(1)链表建立
(2)插入运算
(3)删除运算
(4)查找运算
(5)判断是否为空

三、实验代码(包括运行结果截图)

1.  #include<stdio.h>  
2.  #include<stdlib.h>  
3.    
4.  /*定义*/  
5.  typedef int DataType;  
6.  struct Node{  
7.      int n;  
8.      DataType info;  
9.      struct Node *link;  
10. };  
11. typedef struct Node *LinkList;  
12. typedef struct Node *PNode;  
13.   
14. LinkList initLinkList()  
15. {  
16.     LinkList head;  
17.     head = (LinkList)malloc(sizeof(struct Node));  
18.     if (head == NULL)  
19.     {  
20.         printf("内存分配失败!\n");  
21.         return 0;  
22.     }  
23.     head->link = NULL;  
24.     return head;  
25. }  
26.   
27. /*创建链表*/  
28. void createLinkList(LinkList head)  
29. {  
30.     LinkList rear;  
31.     PNode p;  
32.     head->n = 0;  
33.     int m;  
34.     rear = head;  
35.     scanf_s("%d", &m);  
36.     while (m != -1)  
37.     {  
38.         p = (PNode)malloc(sizeof(struct Node));  
39.         p->info = m;  
40.         p->link = NULL;  
41.         rear->link = p;  
42.         rear = p;  
43.         head->n ++ ;  
44.         scanf_s("%d", &m);  
45.     }  
46. }  
47.   
48. /*插入运算*/  
49. /*查找i所在节点p*/  
50. PNode Locate_i(LinkList llist, int i)  
51. {  
52.     PNode p; int count = 0;  
53.     p = llist->link;  
54.     While (Count < i)  
55.     {  
56.         p = p->link;  
57.         count++;  
58.     }  
59.     return p;  
60. }  
61.   
62. /*判断是否为空*/  
63. int isEmptyLinkList(LinkList llist)  
64. {  
65.     return (llist->link == NULL);  
66. }  
67.   
68. /*查找p所指结点的前驱结点*/  
69. PNode locatePre_link(LinkList llist, PNode p)  
70. {  
71.     PNode p1;  
72.     if (isEmptyLinkList(llist))  
73.         return 0;  
74.     p1 = llist;  
75.     while (p1 != NULL&&p1->link != p)  
76.         p1 = p1->link;  
77.     return p1;  
78. }  
79.   
80. /*后插法*/  
81. int insertPost_link(LinkList llist, PNode p, DataType x)  
82. {  
83.     PNode q = (PNode)malloc(sizeof(struct Node));  
84.     if (q == NULL)  
85.     {  
86.         printf("out of space!\n");  
87.         return 0;  
88.     }  
89.     Else  
90.     {  
91.         q->info = x;  
92.         q->link = p->link;  
93.         p->link = q;  
94.         return 1;  
95.     }  
96. }  
97.   
98. /*前插法*/  
99. int insertPre_link(LinkList llist, PNode p, DataType x)  
100.    {  
101.        PNode p1 = (PNode)malloc(sizeof(struct Node));  
102.        if (p1 == NULL)  
103.            return 0;  
104.        p1 = llist;  
105.        while (p1 != NULL&&p1->link != p)  
106.            p1 = p1->link;  
107.        insertPost_link(llist, p1, x);  
108.        return 1;  
109.    }  
110.      
111.    /*删除运算*/  
112.    int deleteLinkList(LinkList llist, DataType x)  
113.    {  
114.        PNode p, q;  
115.        p = llist;  
116.        if (p == NULL)  
117.            return 0;  
118.        while (p->link != NULL&&p->link->info != x)  
119.            p = p->link;/*找值为x的节点的存储位置*/  
120.        if (p->link == NULL)  
121.        {  
122.            printf("No exist!\n");  
123.            return 0;  
124.        }  
125.        else  
126.        {  
127.            q = p->link;  
128.            p->link = q->link;  
129.            free(q);  
130.            return 1;  
131.        }  
132.    }  
133.      
134.    /*查找运算*/  
135.    PNode findLinkList(LinkList llist, DataType x)  
136.    {  
137.        PNode p;  
138.        if (llist == NULL)  
139.            return 0;  
140.        p = llist->link;  
141.        while (p != NULL&&p->info != x)  
142.            p = p->link;  
143.        return p;  
144.    }  
145.      
146.    /*输出*/  
147.    void printLinkList(LinkList head)  
148.    {  
149.        int j;  
150.        j = head->n;  
151.        head = head->link;  
152.        While (head)  
153.        {  
154.            printf("%d ", head->info);  
155.            head = head->link;  
156.        }  
157.        printf("\n");  
158.    }  
159.      
160.    int main()  
161.    {  
162.        int i,k,flag=0;  
163.        DataType x, n;  
164.        LinkList l;  
165.        PNode p, q;  
166.        l = initLinkList();  
167.        printf("------请输入单链表数据以-1结尾------\n");  
168.        createLinkList(l);  
169.        printf("此单链表为:\n");  
170.        printLinkList(l);  
171.        printf("------插入运算:请选择 前插法选1 后插法选0------\n");  
172.        scanf_s("%d", &flag);  
173.        printf("------请选择插入位置------\n");  
174.        scanf_s("%d", &i);  
175.        p = Locate_i(l, i-1);  
176.        if (flag==0)  
177.        {  
178.            printf("------后插法:输入x表示插入的数字------\n");  
179.            scanf_s("%d", &x);  
180.            insertPost_link(l, p, x);  
181.        }  
182.        else if(flag==1)  
183.        {  
184.            printf("------前插法:输入x表示插入的数字------\n");  
185.            q = locatePre_link(l,p);  
186.            scanf_s("%d", &x);  
187.            insertPre_link(l, p, x);  
188.        }  
189.        else
190.            printf("输入有误!!\n");  
191.        printf("单链表此时为:\n");  
192.        printLinkList(l);  
193.        printf("------输入k表示要删除的数据------\n");  
194.        scanf_s("%d", &k);  
195.        deleteLinkList(l, k);  
196.        printf("单链表此时为:\n");  
197.        printLinkList(l);  
198.        printf("------输入查找的数据n------\n");  
199.        scanf_s("%d", &n);  
200.        if (findLinkList(l, n))  
201.            printf("YES\n");  
202.        else  
203.            printf("NO\n");  
204.        printf("------判断是否为空链表------\n");  
205.        if (isEmptyLinkList(l))  
206.            printf("TRUE\n");  
207.        else 
208.            printf("FALSE\n");  
209.        return 0;  
210.    }  
211.       

这里写图片描述

猜你喜欢

转载自blog.csdn.net/Around_corner/article/details/78508623
今日推荐