1.建表

typedef struct Node
{
int data;
struct Node*next;
}Node;
Node*CreateList(Node*L,int n)
{
L=malloc(sizeof(Node*));
L->next=NULL;//初始化
Node*p;
srand((unsigned)time(0));
for(int i=0;i<n;i++)
{
p=malloc(sizeof(Node*));
p->data=rand()%100;
p->next=L->next;
L->next=p;
}
return L;
}

这个建表属于老套路了。不过这里注意一点,就是对于CreateList返回什么是比较重要的,因为这个关系到了我们后面的调用。

2.读数据

int Get(Node*L,int i,int *e)
{
Node*p=L->next;
int j=1;
while(j<i&&p)
{
p=p->next;
++j;
}
*e=p->data;
return *e;
}

这个读入数据也是一个基本操作

3.插入数据

void InsertList(Node*L,int i,int e)
{
Node*p=L;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
Node*s=malloc(sizeof(Node));
s->data=e;
s->next=p->next;
p->next=s;
}

插入数据和删除数据,这个Node*p=L是一样的,但是和读数据是不一样的。主要是插入数据和删除数据从头结点开始(不是第一个结点,头结点过后才是第一个结点),读数据则是从第一个结点开始。

这里说下头结点和头指针,头结点就是一个没有什么实际用处的结点,他的数据域不重要,数据存储从第一个结点开始,而头指针就是头结点的指针域。

4.删除数据

void DeleteList(Node*L,int i)
{
Node*p=L;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
Node*q=p->next;
p->next=q->next;
free(q);
}

这个就是删除数据,和插入数据略有不同

5.将表清空

void ClearList(Node*L)
{
Node*p=L->next,*q;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;//头结点指针域为空
}

这里的话,清空从第一个结点开始的都要清空,注意:头结点不是第一个,头结点本身没有实际意义。

6.调用链表

这一步废了我老大的劲,因为这个大话数据结构的代码调用我是真的....我觉得可能单纯只是为了理解?

int main()
{
Node* L = NULL;
int n = 10;
L = CreateList(L, n);
int e = 0;
for (int i = 1; i <=n; i++)
{
e = Get(L, i, &e);
printf("%d ", e);
}
//插入数据
InsertList(L, 1, 20);
printf("\n");
for (int i = 1; i <=n+1; i++)
{
e = Get(L, i, &e);
printf("%d ", e);
}
//删除数据
DeleteList(L, 1, 20);
printf("\n");
for (int i = 1; i <=n; i++)
{
e = Get(L, i, &e);
printf("%d ", e);
}
//清空链表
//ClearList(L);
return 0;
}

7.全部代码:

#include<stdio.h>
#include<malloc.h>
#include<time.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node* next;
}Node;
Node* CreateList(Node* L, int n)
{
L = malloc(sizeof(Node*));
L->next = NULL;//初始化
Node* p;
srand((unsigned)time(0));
for (int i = 0; i < n; i++)
{
p = malloc(sizeof(Node*));
p->data = rand() % 100;
p->next = L->next;
L->next = p;
}
return L;
}
int Get(Node* L, int i, int* e)
{
Node* p = L->next;
int j = 1;
while (j < i && p)
{
p = p->next;
++j;
}
*e = p->data;
return *e;
}
void InsertList(Node* L, int i, int e)
{
Node* p = L;
int j = 1;
while (p && j < i)
{
p = p->next;
++j;
}
Node* s = malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
}
void DeleteList(Node* L, int i)
{
Node* p = L;
int j = 1;
while (p && j < i)
{
p = p->next;
++j;
}
Node* q = p->next;
p->next = q->next;
free(q);
}
void ClearList(Node* L)
{
Node* p = L->next, * q;
while (p)
{
q = p->next;
free(p);
p = q;
}
L->next = NULL;//头结点指针域为空
}
int main()
{
Node* L = NULL;
int n = 10;
L = CreateList(L, n);
int e = 0;
for (int i = 1; i <=n; i++)
{
e = Get(L, i, &e);
printf("%d ", e);
}
//插入数据
InsertList(L, 1, 20);
printf("\n");
for (int i = 1; i <=n+1; i++)
{
e = Get(L, i, &e);
printf("%d ", e);
}
//删除数据
DeleteList(L, 1, 20);
printf("\n");
for (int i = 1; i <=n; i++)
{
e = Get(L, i, &e);
printf("%d ", e);
}
//清空链表
//ClearList(L);
return 0;
}