数据结构(C语言版)学习笔记2-单链表
1.单链表定义
typedef int ElemTypes;
typedef struct node
{
ElemTypes data; //数据域
struct node *next;//指针域
}Slinks;
2.单链表基本操作
//1.单链表初始化(带头结点)
Slinks *creatslink(int i);
//2.求链长(带头结点)
ElemTypes ListLengths(Slinks*head);
//3.取链表内元素
int GetElems(Slinks*L,int i,ElemTypes*t);
//4插入操作
int InsertLists(Slinks*L,int i,ElemTypes e);
//5.删除操作
int DeleteLists(Slinks*L,int i);
//6.定位操作
int LocateLists(Slinks*L,ElemTypes e);
//7.输出链表
void Lists(Slinks*L);
3.完整程序
完整程序包括三个文件:
mains.c(主程序)
用于测试单链表基本操作
Slink.h
标准库导入,存放类型定义,符号定义等预定义内容及函数声明。
Slink.c
存放单链表基本操作函数主体内容。
①mains.c
//mains.c
#include"Slink.h"
void main()
{
int j=0;
Slinks *L=NULL; //创建一个结构体指针指向单向链表头
printf("\n-------程序运行开始!-------\n");
L=creatslink(5);
Lists(L);
printf("\n链表长为:%d\n",ListLengths(L));
//3.取链表内元素
GetElems(L,3,&j);
printf("表内第3个元素为:%d\n",j);
InsertLists(L,2,666);
printf("\n链表长为:%d\n",ListLengths(L));
Lists(L);
printf("删除操作%d\n", DeleteLists(L,3));
Lists(L);
printf("元素666在第%d号元素。\n", LocateLists(L,666));
printf("\n-------程序运行结束!-------\n");
}
②Slink.h
//Slink.h
#ifndef _SLINK_H
#define _SLINK_H
#include"stdio.h"
#include"stdlib.h"
typedef int ElemTypes;
typedef struct node
{
ElemTypes data; //数据域
struct node *next;//指针域
}Slinks;
/*基本操作声明*/
//1.单链表初始化(带头结点)
Slinks *creatslink(int i);
//2.求链长(带头结点)
ElemTypes ListLengths(Slinks*head);
//3.取链表内元素
int GetElems(Slinks*L,int i,ElemTypes*t);
//4插入操作
int InsertLists(Slinks*L,int i,ElemTypes e);
//5.删除操作
int DeleteLists(Slinks*L,int i);
//6.定位操作
int LocateLists(Slinks*L,ElemTypes e);
//7.输出链表
void Lists(Slinks*L);
#endif
③Slink.c
//Slink.c
#include"Slink.h"
//1.单链表初始化(带头结点)
Slinks *creatslink(int i)
{
Slinks *p,*s,*head;
int j=0;
p=head=(Slinks*)malloc(sizeof(Slinks));//创建头指针
for(j=0;j<i;j++)
{
s=(Slinks*)malloc(sizeof(Slinks));//创建第j+2个结点存储第j+1个元素
printf("请输入第%d个元素:",j+1);
scanf("%d",&s->data); //结点数据域赋值
p->next=s; //将上一个结点的next指针指向该结点
p=s; //将P指针指向该结点
}
p->next=NULL;//将最后一个结点的next指针置空
printf("链表创建成功!head=%o\n",head);
return head;
}
//2.求表长(含首元结点)
ElemTypes ListLengths(Slinks*head)
{
int i;
Slinks*p=head;
for(i=0;p!=NULL && p->data;i++)//循环历遍结点个数
p=p->next;
return i;//含首元结点
}
//3.取链表内元素
int GetElems(Slinks*L,int i,ElemTypes*t)
{
int n;
Slinks*p=L;
if(i<1 || i>ListLengths(L))return 0;//参数i不合理,取元素失败返回0
for(n=0;n<i;n++)//循环历遍结点个数
p=p->next;
*t=p->data; //其值通过指针t返回
return 1;
}
//4.插入操作
int InsertLists(Slinks*L,int i,ElemTypes e)
{
Slinks*p=L,*t;
int n;
if(i<1 || i>ListLengths(L))return 0;
else{
for(n=0;n<i-1;n++)
p=p->next;
t=p->next;
p->next=(Slinks*)malloc(sizeof(Slinks));
p=p->next;
p->data=e;
p->next=t;
return 1;
}
}
//5.删除操作
int DeleteLists(Slinks*L,int i)
{
Slinks*p=L,*t;
int n;
if(i<1 || i>ListLengths(L))return 0;
else{
for(n=0;n<i-1;n++)
p=p->next;
t=p->next;
p->next=t->next;
free(t);
return 1;
}
}
//6.定位操作
int LocateLists(Slinks*L,ElemTypes e)
{
Slinks*p=L;
int n;
for(n=0;p->data!=e && p!=NULL;n++)
p=p->next;
if(p->data == e)//找到,返回位序
return n;
else //没找到,返回0
return 0;
}
//7.输出链表
void Lists(Slinks*L)
{
Slinks*p=NULL;
p=L;
p=p->next; //跳过首元结点
printf("链表内元素为:\n");
while(p!=NULL && p->data)
{
printf("-%d",p->data);
p=p->next;
}
printf("\n");
}
本次学习笔记如上所示,不足之处欢迎大家批评指正。