数据结构(C语言版)链表相关操作算法的代码实现

  这次实现的是带头结点的单链表的初始化、遍历、创建、插入、删除、判断链表是否为空、求链表长度函数,编译环境是vs2013。

  其中插入和删除函数中循环的条件目前还不太明白。

#include<iostream>
using namespace std;
typedef int Status;
typedef char Elemtype;
//定义链表的存储结构,注意这里与算法的定义有一处不同,是定义结构体时就命名Lnode,说明*next的类型只要说是Lnode类型就可以
typedef struct Lnode{
Elemtype data;
Lnode *next;
}Lnode, *LinkList;
//各函数声明部分
Status InitLinkList(LinkList &L);//初始化
Status CreateList(LinkList &L, int length);//创建链表
Status TraverseList(LinkList L);//遍历
Status GetLength(LinkList L);//求长度
Status IsEmpty(LinkList L);//判断是否为空
Status InsertList(LinkList &L, int target, Elemtype e);//第target个元素前插入元素
Status DeleteList(LinkList &L, int target, Elemtype &e);//删除第target元素
void main(){
LinkList link=NULL;
int n=;
InitLinkList(link);
CreateList(link, n);
//printf("%d",GetLength(link));
//char *s = IsEmpty(link)?"链表为空!":"链表不为空!";
//printf("判断结果:%s\n", s);
//InsertList(link, 2, '3');
Elemtype e;
DeleteList(link,,e);
printf("删除的元素是:%c\n", e);
TraverseList(link);
getchar(); }
//链表初始化函数:创建头指针,指针域赋空值
Status InitLinkList(LinkList &L){
L = (LinkList)malloc(sizeof(Lnode));
if (!L){
return false;
}
L->next = NULL;
return true;
}
//创建链表函数:
Status CreateList(LinkList &L, int length){
LinkList p=NULL, q=NULL;
q = L;
q->next;
for(int i = ; i <length; i++){
p = (LinkList)malloc(sizeof(Lnode));
if (!p){
return false;
}
printf("输入存入链表的字符:\n");
scanf_s("%c", &p->data);
//2016.4.11报错原因:微软改写了c的函数,加入了参数检测
//方法:将scanf()函数改为scanf_s()函数
getchar();
//2016.4.12循环只读入了第一次,原因是vs不读入回车,输入的回车会作为下次循环的输入,看起来像没读入
//解决方法:在scanf后写getchar函数,接收回车
q->next = p;
p->next = NULL;
q = p;
}
printf("链表创建成功!\n");
return true;
}
//链表遍历函数
Status TraverseList(LinkList L){
LinkList p = NULL;
p = L->next;
//2016.4.12遍历时第一个元素为空,丢掉了最后一个元素,因为头结点不含有效值
//所以要将遍历的起点设在第一元素结点处:L->next
if (!p){
return false;
}
while (p)//注意这里的判断条件是p,不是p->next
{
printf("链表中的元素:");
printf("%c", p->data);
printf("\n");
p = p->next;
}
return true;
}
int GetLength(LinkList L){
LinkList p=L->next;//注意这里的起点仍为首元结点,因此返回的链表长度是除去头结点的
int count=;
while (p){
count++;
p = p->next; }
return count;
}
//判断链表是否为空
Status IsEmpty(LinkList L){
if (L->next == NULL){
return true;
}
return false;
}
//在第target个元素前插入一个元素
Status InsertList(LinkList &L, int target, Elemtype e){ LinkList p=L;//这里起点是头结点,因为可能插在第一个元素之前
LinkList s = NULL;
int i = ;
while (p&&i < target-){ //不太懂这里的条件
p = p->next;
++i;
}
if (!p||target>i-){//判断非法位置
return false;
} s = (LinkList)malloc(sizeof(Lnode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//删除第target个元素
Status DeleteList(LinkList &L, int target, Elemtype &e){
int i=;
LinkList p = L;
LinkList q = NULL;
while (p->next&&i < target - ){
p = p->next;
i++;
}
if (!(p->next) || i>target - ){
return false;
}
q = p->next;
p->next = q->next;
e = q->data;
free(q); }
上一篇:Linux--------------安装vsftpd


下一篇:spring cloud熔断监控Hystrix Dashboard和Turbine