数据结构(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"); }
本次学习笔记如上所示,不足之处欢迎大家批评指正。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/12914.html