链表的一些基本操作,记得上学期刚学c语言的时候觉得很难,加上自己学习态度不端正,那一部分就没学好,期末考便考到了链表,没有做出来。不过这里给小白的建议(虽然我也还是个小白)就是端正自己的学习态度,觉得难的话沉下心来慢慢学,思路慢慢就会明了的。下面给的代码包含了创建,插入,删除操作,有一点不全。
#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode{
int data; //链表数据域
struct Lnode * next; //链表指针域
} LinkList;
void Create_List(LinkList *);//创建一个空链表,L作为头结点,其数据域储存链表长度 方便操作
void Fill_List(LinkList *); //填充该链表,方便测试
void Insert_List(LinkList *,int ,int );//在第n个结点之前增加元素e
void Delete_List(LinkList *,int ); //删除第n个元素
void Print_List(LinkList *); //输出链表各个结点的数值
int main() //测试各函数功能
{
int n=1,e=100; //这里作为测试值
LinkList * L;
L = (LinkList *)malloc(sizeof(LinkList));//初始化指针 *L作为头结点
Create_List(L);
Fill_List(L);
Print_List(L);
Insert_List(L,n,e);
Print_List(L);
Delete_List(L,n+1);
Print_List(L);
return 0;
}
void Create_List(LinkList *L)
{
L->data = 0;
L->next = NULL;
}
void Fill_List(LinkList *L)
//这里采用头插法 ,即从链表首端插入(头结点之后)
{
int i;
LinkList * p;
for(i = 0;i<9;i++)
{
p = (LinkList *)malloc(sizeof(LinkList)); //为新结点分配内存
p->next = L->next; //将新结点的指针域指向L->next 即原来L后面的元素地址,实现新结点*p与L后面的元素连接
L->next = p; //将L->next指向新结点,实现L与新结点连接,至此,结点连接工作已完成
p->data = i; //存入数据域
L->data ++; //长度+1
}
}
void Print_List(LinkList *L)
{
LinkList * p = L->next; //初始化p,使其指向L后面的结点,即第一个结点
printf("the Elements of the LinkList:\n");
while(p) //当p存在时
{
printf("%d ",p->data);
p = p->next; //p后移
}
printf("\n");
}
void Insert_List(LinkList *L,int n,int e)
{
int i;
LinkList * p = L;
LinkList * s = (LinkList *)malloc(sizeof(LinkList *));
if(n<=0||n>L->data)
{
printf("Input Error");
exit(1);
}
for(i = 0;i<(n-1) ;i++)
{
p = p->next; //p不断后移,因为这里是在第n个结点前插入,故移动n-1次
}
s->next = p->next; //p->next即为第n个结点地址,这里解释与Fill_List插入部分相同
p->next = s;
s->data = e;
L->data ++;
}
void Delete_List(LinkList *L,int n)
{
int i;
LinkList * p = L;
if(n<=0||n>L->data)
{
printf("Input Error");
exit(1);
}
for(i = 0;i<(n-1);i++)
{
p = p->next; //找到第n-1个结点
}
p->next = p->next->next; //直接绕过第n个结点,将其与第n+1个结点连接,实现删除操作
}