这里做一下单向链表的c语言实现,虽然之前有很多次实现过,但是这次实现还是有收获的!下面上代码。
typedef struct node {
char data;
struct node *next;
}Linklist;
Linklist *createlinklist_head () ;
Linklist *createlinklist_tail () ;
Linklist *get (Linklist *L , int i) ;
int del (Linklist *L , int i , char *e) ;
这是头文件,主要定义了单项链表的数据结构和函数头,这里我没有太在意细节,直接将单向链表中的数据部分改成char类型,主要是实现算法:)。
#include <stdio.h>
#include "linklist.h"
#include <stdlib.h>
Linklist *createlinklist_head () {
Linklist *L , *s;
int flag = 1;
char c;
L = (Linklist *) malloc (sizeof (Linklist));
L->next = NULL;
while (flag) {
c = getchar ();
if (c == '.')
flag = 0;
else {
s = (Linklist *) malloc (sizeof (Linklist));
s->data = c;
s->next = L->next;
L->next = s;
}
}
return L;
}
Linklist *createlinklist_tail () {
Linklist *L , *s , *temp;
int flag = 1;
char c;
L = (Linklist *) malloc (sizeof (Linklist));
L->next = NULL;
temp = L;
while (flag) {
c = getchar ();
if (c == '.')
flag = 0;
else {
s = (Linklist *) malloc (sizeof (Linklist));
s->data = c;
temp->next = s;
s->next = NULL;
temp = s;
}
}
return L;
}
Linklist *get (Linklist *L , int i) {
int j = 0;
Linklist *temp = L;
while (temp->next != NULL && j < i) {
temp = temp->next;
j++;
}
return temp;
}
int del (Linklist *L , int i , char *e) {
int j = 0;
Linklist *temp = L;
Linklist *pre;
if (temp == NULL) {
printf ("arguement L error!\n");
return 0;
}
if (i <= j) {
printf ("arguement i error!(too small)\n");
return 0;
}
while (1) {
j++;
pre = temp;
temp = temp->next;
if (j == i && temp != NULL) {
*e = temp->data;
pre->next = temp->next;
free (temp);
return 1;
}
else if (temp == NULL) {
printf ("arguement i error!(too big)\n");
return 0;
}
}
}
以上就是单项链表的主要基本操作,其中包括头插法建表,尾插法建表,取操作,删除操作。其中每个算法我都检验过了,就不放上调试的代码了。
总结:这里其实还是有些非常容易犯的错误一个就是声明的指针不能直接使用,而是要对其进行赋值,或者将其malloc一下,我在这里搞了老半天调试,最后发现这个经常犯的问题。同时在头插法建表的时候也需要注意对头节点的处理,这也是很重要的。这就是这次的主要收获吧!每天都要进步!马上期末了,可能要停更一段时间。