#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
typedef int ElemType;
typedef struct LNode //节结点数据类型定义
{
ElemType data;//存放数据
struct LNode *next;//指向下一个指针
}LinkList;
void CreatListR_L(LinkList *L,ElemType a[],int n)//尾插法建表
{
LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList));//创建头结点
r=L;//r始终指向尾结点,开始时指向头结点
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));//生成新节点
s->data=a[i];//新结点插入数据
r->next=s;//将s插入r后
r=s;
}
r->next=NULL;//尾结点设置为空
}
void IinkList(LinkList *L)//初始化单链表
{
L=(LinkList*)malloc(sizeof(LinkList ));
L->next=NULL;
}
void DestoryList_L(LinkList *L)//摧毁单链表
{
LinkList *pre=L,*p=L->next;//*pre指向p的前驱结点
while(p!=NULL)//扫描链表
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
_Bool ListEmpty_L(LinkList *L)//判断单链表是否为空
{
return(L->next=NULL);
}
int ListLength_L(LinkList *L)//输出单链表长度
{
LinkList *p=L;
int n=0;
while (p->next!=NULL)//指针p向后扫描,计算单链表长度
{
n++;
p=p->next;
}
return n; //返回长度
}
int GetElem_L(LinkList *L,int i,ElemType e)//求单链表中某个数据元素值
{
int j=0;
LinkList *p=L;//设置指针p指向L的头结点
while(p!= NULL&&j<i)//查找第i个结点
{
j++;
p=p->next;
}
if(p==NULL)//没有这个结点
{
return 0;
}
else//存在这个结点,返回相应数值e
{
e=p->data;
return e;
}
}
int LocateElem_L(LinkList *L,ElemType e)//查找某元素的逻辑位置
{
int i=1;//从1开始
LinkList *p=L->next;//p指向开始结点
while(p!=NULL&&p->data!=e)//查找data为e的结点,其序号为i
{
p=p->next;
i++;
}
if(p==NULL)
return 0;
else
return i;
}
_Bool LinkInsert_L(LinkList *L,int i,ElemType e)//在单链表第i个位置前插入数据,即将数据插入到第几位
{
LinkList *p=L,*s;
int j=0;
if(i<1)
return 0;
while(p!=NULL&&j<i-1)//寻找第i-个结点
{
j++;
p=p->next;
}
if(p==NULL)//找不到
return 0;
else //找到了,插入新结点
{
s=(LinkList *)malloc(sizeof(LinkList));//创建新结点
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
}
void DispList(LinkList *L) //输出链表(像判空,计算长度,输出链表无增减操作用*L,具体的我暂时说不来)
{
LinkList *p = L->next;
while(p != NULL)
{
printf("%d", p->data);
p = p->next;
}
printf("\n");
}
int DeleteList(LinkList *L, int i, ElemType *e)// 删除操作:删除第i个元素,用&e(地址)来装删除的元素,可以知道删除了什么
{
int j = 0;
LinkList *p = L, *q;
while((j < i - 1) && (p != NULL))
{
j++;
p = p->next;
}
if(p == NULL)
{
return 0;
}
else
{
q = p->next;
if(q == NULL)
return 0;
e =&(q->data);
p->next = q->next;
free(q);
return 1;
}
}
void DestroyList(LinkList *L)//销毁链表
{
LinkList *p = L,*q = p->next;
while(q != NULL) //重点×4
{
free(p); //释放p(相当于C++的Delete)
p = q;
q = p->next;
}
free(p);
}
void main()
{
LinkList *L;
ElemType e;
printf("(1)初始化单链表L\n");
IinkList(L);
printf("(2)依次采用尾插法插入a,b,c,d,e元素\n");
ElemType a[5]={'a','b','c','d','e'};
CreatListR_L(L, a, 5);
printf("(3)输出单链表:\n");
DispList(L);
printf("(4)输出单链表的长度:%d\n",ListLength_L(L));
printf("(5)单链表L为:%s\n",(ListEmpty_L(L) ? "空":"非空"));
GetElem_L(L, 2, e);
printf("(6)单链表L的第3个元素为%c\n",GetElem_L(L, 3, e));
printf("(7)元素a的位置为%d\n", LocateElem_L(L, 'a'));
printf("(8)在第4个元素位置上插入元素r\n");
LinkInsert_L(L, 4, 'r');
printf("(9)输出单链表L:\n");
DispList(L);
printf("(10)删除L的第3个元素\n");
DeleteList(L, 3, e);
printf("(9)输出单链表L:\n");
DispList(L);
printf("(12)释放单链表L\n");
DestroyList(L);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
typedef char ElemType; /////////////////////////char类型
typedef struct LNode //节结点数据类型定义
{
ElemType data;//存放数据
struct LNode *next;//指向下一个指针
}LinkList;
void CreatListR_L(LinkList *(&L),ElemType a[],int n)//尾插法建表 ///////////////////借助C++的引用(别名) 在L前面加个&
{
LinkList *s,*r;
int i;
// L=(LinkList *)malloc(sizeof(LinkList));//创建头结点 //////////////////////////不需要再malloc一次
r=L;//r始终指向尾结点,开始时指向头结点
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));//生成新节点
s->data=a[i];//新结点插入数据
r->next=s;//将s插入r后
r=s;
}
r->next=NULL;//尾结点设置为空
}
void IinkList(LinkList * (&L))//初始化单链表 ///////////////////借助C++的引用(别名) 在L前面加个&
{
L=(LinkList*)malloc(sizeof(LinkList ));
L->next=NULL;
}
void DestoryList_L(LinkList *L)//摧毁单链表
{
LinkList *pre=L,*p=L->next;//*pre指向p的前驱结点
while(p!=NULL)//扫描链表
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
bool ListEmpty_L(LinkList *L)//判断单链表是否为空
{
return(L->next==NULL); ///////////////////////等于号不是赋值号
}
int ListLength_L(LinkList *L)//输出单链表长度
{
LinkList *p=L;
int n=0;
while (p->next!=NULL)//指针p向后扫描,计算单链表长度
{
n++;
p=p->next;
}
return n; //返回长度
}
int GetElem_L(LinkList *L,int i,ElemType &e)//求单链表中某个数据元素值////////////////e前面加一个&表示引用
{
int j=0;
LinkList *p=L;//设置指针p指向L的头结点
while(p!= NULL&&j<i)//查找第i个结点
{
j++;
p=p->next;
}
if(p==NULL || i<1)//没有这个结点 或者 i不合法小于1/////////////////////////////
{
return 0;
}
else//存在这个结点,返回相应数值e
{
e=p->data;
return 1;
}
}
int LocateElem_L(LinkList *L,ElemType e)//查找某元素的逻辑位置
{
int i=1;//从1开始
LinkList *p=L->next;//p指向开始结点
while(p!=NULL&&p->data!=e)//查找data为e的结点,其序号为i
{
p=p->next;
i++;
}
if(p==NULL)
return 0;
else
return i;
}
int LinkInsert_L(LinkList *L,int i,ElemType e)//在单链表第i个位置前插入数据,即将数据插入到第几位
{
LinkList *p=L,*s;
int j=0;
if(i<1)
return 0;
while(p!=NULL&&j<i-1)//寻找第i-个结点
{
j++;
p=p->next;
}
if(p==NULL)//找不到
return 0;
else //找到了,插入新结点
{
s=(LinkList *)malloc(sizeof(LinkList));//创建新结点
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
}
void DispList(LinkList *L) //输出链表(像判空,计算长度,输出链表无增减操作用*L,具体的我暂时说不来)
{
LinkList *p = L->next;
while(p != NULL)
{
printf("%c", p->data); //////////////////////////////%c
p = p->next;
}
printf("\n");
}
int DeleteList(LinkList *L, int i, ElemType &e)// 删除操作:删除第i个元素,用&e(地址)来装删除的元素,可以知道删除了什么//////////////////e不要用指针用引用&e
{
int j = 0;
LinkList *p = L, *q;
while((j < i - 1) && (p != NULL))
{
j++;
p = p->next;
}
if(p == NULL)
{
return 0;
}
else
{
q = p->next;
if(q == NULL)
return 0;
e =(q->data); ///////////////////////////////////////
p->next = q->next;
free(q);
return 1;
}
}
void DestroyList(LinkList *L)//销毁链表
{
LinkList *p = L,*q = p->next;
while(q != NULL) //重点×4
{
free(p); //释放p(相当于C++的Delete)
p = q;
q = p->next;
}
free(p);
}
int main()
{
LinkList *L;
ElemType e;
printf("(1)初始化单链表L\n");
IinkList(L);
printf("(2)依次采用尾插法插入a,b,c,d,e元素\n");
ElemType a[5]={'a','b','c','d','e'};
CreatListR_L(L, a, 5);
printf("(3)输出单链表:\n");
DispList(L);
printf("(4)输出单链表的长度:%d\n",ListLength_L(L));
printf("(5)单链表L为:%s\n",(ListEmpty_L(L) ? "空":"非空"));
if(GetElem_L(L, 3, e))
printf("(6)单链表L的第3个元素为%c\n",e);
printf("(7)元素a的位置为%d\n", LocateElem_L(L, 'a'));
printf("(8)在第4个元素位置上插入元素r\n");
LinkInsert_L(L, 4, 'r');
printf("(9)输出单链表L:\n");
DispList(L);
printf("(10)删除L的第3个元素\n");
DeleteList(L, 3, e);
printf("(9)输出删除的元素以及单链表L:\n%c ",e);
DispList(L);
printf("(12)释放单链表L ");
DestroyList(L);
return 0;
}
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html