数据结构 线性链表
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 #define OK 1
5 #define ERROR 0
6 #define OVERFLOW -1
7
8 typedef int Elemtype;
9
10 typedef struct LNode//线性链表
11 {
12 Elemtype data;
13 struct LNode *next;
14
15 } LNode,*Linklist;
16
17 int init_Linklist(Linklist &l)
18 {
19 l=(Linklist)malloc(sizeof(LNode));//建立头结点,并给头结点元素赋初值
20
21 if(!l)
22 exit(OVERFLOW);
23
24 l->next=NULL;
25 l->data=0;
26
27 return OK;
28 }
29
30 int input_Linklist(Linklist &l)
31 {
32 int n;
33 printf("\n输入个数:\n");
34 scanf("%d",&n);
35 printf("\n输入数据:\n");
36
37 Linklist tail = l;//新建一个临时的尾节点
38
39 for(int i=0;i<n;i++)
40 {
41 Linklist p=(Linklist)malloc(sizeof(LNode));//新建一个节点为当前节点
42 scanf("%d",&p->data);
43
44 p->next=tail->next;
45 tail->next=p;//尾接法
46
47 tail=tail->next;//保持为尾节点,使链表创建顺序正常
48 }
49 return OK;
50 }
51
52 int get_Elem(Linklist l,int i,Elemtype &e)
53 {
54 //l为带头结点的单链表的头指针
55 //当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
56 Linklist p=l->next;
57 int j=1;
58 while(p&&j<i)
59 {
60 p=p->next;
61 j++;
62 }
63
64 if(!p||j>i)
65 return ERROR;
66
67 e=p->data;
68 return OK;
69 }
70
71 int insert_Linklist(Linklist &l,int i,Elemtype e)
72 {
73 //在带头结点的单链表l的第i个位置之前插入元素e
74 Linklist p=l;
75 int j=0;
76
77 while(p&&j<i-1)//找到第i-1结点,(j=0头结点/j=1第1结点)
78 {
79 p=p->next;
80 j++;
81 }
82
83 if(!p||j>i-1)//p为空/i输入错误
84 return ERROR;
85
86 Linklist s=(Linklist)malloc(sizeof(LNode));
87
88 s->data=e;
89 s->next=p->next;
90 p->next=s;
91
92 return OK;
93 }
94
95 int delete_Linklist(Linklist &l,int i,Elemtype &e)
96 {
97 //在带头结点的单链表l中,删除第i个元素,并使e返回其值
98 Linklist p=l;
99 int j=0;
100
101 while(p->next&&j<i-1)//寻找第i个节点,并令p指向其前驱节点
102 {
103 p=p->next;
104 j++;
105 }
106
107 if(!(p->next)||j>i-1)
108 return ERROR;//删除位置不合理
109
110 Linklist q=p->next;
111 p->next=q->next;//链表中删去q节点
112 e=q->data;//记录数据
113 free(q);//释放q节点
114
115 return OK;
116 }
117
118 int output_Linklist(Linklist &l)
119 {
120 printf("\nLinklist:\n");
121
122 Linklist p=l;
123
124 while(p->next!=NULL)
125 {
126 printf("%5d",p->next->data);
127 p=p->next;
128 }
129 printf("\n");
130
131 return OK;
132 }
133
134 int free_Linklist(Linklist &l)
135 {
136 while(l->next!=NULL)
137 {
138 Linklist Q=l->next;
139 l->next=Q->next;//删去表头的后一个节点
140
141 free(Q);//释放该节点
142 }
143 free(l);//头结点也释放
144
145 return OK;
146 }
147
148 int main()
149 {
150 Linklist la;
151
152 init_Linklist(la);
153
154 printf("\n请输入线性链表A:\n");
155 input_Linklist(la);
156
157
158 printf("\n线性链表A为:\n");
159
160 output_Linklist(la);
161
162 free_Linklist(la);
163
164 return 0;
165 }
PS:这个月一篇博客都没发,不知道干啥去了,想了想还是水一篇博客吧,这个是数据结构课里面的线性链表,
主要有链表创建、输入输出、插入、删除、释放等操作,仅供参考......
大佬见笑,,