用c语言实现基本数据结构(链表)
感觉写链表比较考验对指针的理解。。。
下图可以方便对链表中指针进行理解
List* L; //新建链表指针,没有指向任何东西
L = (List *)malloc(sizeof(List)) //从堆中分配List大小的内存空间,赋给L,L就有了指向的空间。
*L //L指向的结构体,一般不用这种写法(主要是不方便)
L->data //L指向的结构体中的数据
L->next //L指向的结构体中的指针next,一个指针类型数据
//c语言的链表中,一个节点的意思就是一个结构体。
首先是单链表
结构体如下
typedef struct Linklist{
int data;
struct Linklist* next;
}List;
方法如下
void InitList(List *L); //初始化链表(建立头节点)
void CreateList(List *L);//创建链表,先输入待输入数据个数,再输入数据
List* FindNode(List *L, int n);//找到第n个节点(从1开始)
void InsertNode(List* L, int n, int data);//在第n个节点后插入节点
int ListLength(List* L);//返回链表长度
int DelNode(List *L, int n);//删除第n个节点
void PrintfList(List *L);//输出所有节点数据
完整代码如下
#include <stdio.h>
#include <stdlib.h>
typedef struct Linklist{
int data;
struct Linklist* next;
}List;
void InitList(List *L){
L = (List *)malloc(sizeof(List));
L->data = 0;
L->next = NULL;
if(L == NULL){
printf("create list wrong!!!\n");
}
}
void CreateList(List *L){
List *tailpoint = L;
int len = 0;
while(len <= 0){
printf("over input data length!\n");
scanf("%d", &len);
}
for(int i = 0; i < len; i++){
List* node = (List *)malloc(sizeof(List));
scanf("%d", &node->data);
node->next = NULL;
tailpoint->next = node;
tailpoint = node;
}
printf("end input!\n");
}
List* FindNode(List *L, int n){
List *p = L;
for(int i = 0; i < n; i++){
if(p == NULL){
printf("list crossover!!!\n");
return NULL;
}
p = p->next;
}
return p;
}
void InsertNode(List* L, int n, int data){
List* p = FindNode(L, n);
List* node = (List*)malloc(sizeof(List));
node->data = data;
node->next = p->next;
p->next = node;
}
int ListLength(List* L){
List *p = L;
int len = 0;
while(p->next != NULL){
p = p->next;
len++;
}
return len;
}
int DelNode(List *L, int n){
List *pre = FindNode(L, n-1);
if(pre->next == NULL){
printf("list crossover\n");
return 0;
}
List *p = pre->next;
pre->next = p->next;
free(p);
return 1;
}
void PrintfList(List *L){
List *p = L->next;
while(p != NULL){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
测试代码如下
#include"myList.h"
int main(){
List *list;
List *node;
printf("-----------------a\n");
InitList(list);
printf("-----------------b\n");
CreateList(list);
PrintfList(list);
printf("-----------------c\n");
node = FindNode(list, 1);
printf("%d\n", node->data);
printf("-----------------d\n");
InsertNode(list, 3, 89);
PrintfList(list);
printf("-----------------e\n");
printf("%d\n", ListLength(list));
printf("-----------------f\n");
DelNode(list, 2);
PrintfList(list);
return 0;
}