目前这个实现是有问题的,但是大体上已经算OK,欢迎大家来帮我完善,谢谢!
这个实现的内容包括,单链表的创建,摧毁,求表长,插入,删除,取某个元素,遍历等操作,欢迎指正!
/*******************************************************
单链表的实现——C语言版
********************************************************/
#include <stdio.h>
#include <stdlib.h>
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE (-1)
#define OVERFLOW (-2)
#define null 0
#define BOOL bool
//定义结构体元素的类型
typedef char ElemType; /* 字符型数据*/
typedef struct LN{ //这里的LNode是结构体类型名
ElemType data;
int Length; //for the length of the linklist
struct LN *next;
}LNode,*LinkList;//这里定义了结构体的变量和指针
//初始化链表
BOOL Init_LinkList(LNode **pLinklist){
*pLinklist = (LNode*)malloc(sizeof(LNode));
if(!(*pLinklist)){
printf("初始化单链表失败!!\n");
return FALSE;
}
//head = pLinklist;//头结点
(*pLinklist)->data = NULL;//数据为0
(*pLinklist)->Length = 1;
(*pLinklist)->next = NULL;//下一指针为空
printf("初始化单链表成功!!\n");
return TRUE;
}
//摧毁表
BOOL Destroy_LinkList(LNode *pLinklist){
//把链表的所有结点都摧毁
LNode* p = NULL;
p = pLinklist;
while(!pLinklist->next){
p = pLinklist;
pLinklist = pLinklist->next;
free(p);
}
free(pLinklist);
printf("摧毁单链表成功!!\n");
return TRUE;
}
//置空表
BOOL Clear_LinkList(LNode *pLinklist){
LNode* p = NULL;
while(!pLinklist->next){
p = pLinklist;
pLinklist = pLinklist->next;
free(p);//现在是剩下最后一个结点
}
pLinklist->data = NULL;
pLinklist->Length = 1;
return TRUE;
}
//求表长
int Length_LinkList(LNode **pLinklist){
return (*pLinklist)->Length;
/*
int n = 0;
LNode *p = *pLinklist;
while(!p->next){
p = p->next;
n++;
}
return (n);
*/
}
//(找到链表中排序为i的元素排序从1开始),并返回给e
BOOL GetElem_LinkList(LNode **pLinklist,int i,ElemType e){
int num = 1;
int length = 0;
LNode *q=*pLinklist;
length = Length_LinkList(pLinklist);
if(i<1||i>length){
printf("要求的位置大于链表的长度!!\n");
return FALSE;
}
while(num<i&&q){
q = q->next;
num++;
}
e = q->data;
printf("取回数据成功!!\n");
return TRUE;
}
//找到链表中排序为i的元素(排序从1开始)
ElemType GetElem2_LinkList(LNode **pLinklist,int i){
int num = 1;
LNode *q = *pLinklist;
if(i<1||i>(*pLinklist)->Length){
printf("要求的位置大于链表的长度!!\n");
return ERROR;
}
while(num<i&&q){
q = q->next;
num++;
}
printf("取回数据成功!!\n");
return q->data;
}
//往从1开始的第i位插入X元素
BOOL Insert_LinkList(LNode **pLinklist,ElemType insdata,int i){
int num = 1;
LNode *ins=NULL,*q=NULL;
ins = (LNode *)malloc(sizeof(LNode));
if(!ins){
printf("空间不够,不能插入!!\n");
return FALSE;
}
ins->data = insdata;
q = *pLinklist;
if(i<1||i>(*pLinklist)->Length){
printf("输入的i值大于链表的表长!!\n");
return FALSE;
}
if(1 == i){
ins->next = q;
*pLinklist = ins;
}else{
while(num<(i-1)&&q->next!=NULL){
q = q->next;
num++;
}
ins->next = q->next;
q->next = ins;
}
(*pLinklist)->Length++;
return TRUE;
}
//返回链表中第一个值为x的元素的序号,序号从1开始算
int Locate_LinkList(LNode **pLinklist,ElemType searchX){
int n = 1;
LNode *p = *pLinklist, *q;
while(p!=NULL&&p->data!=searchX){
q = q->next;
n++;
}
if(!q){
printf("该链表中找不到X元素,请重新确认!!\n");
return ERROR;
}else{
printf("链表中第一个值为x的元素的序号是%d!!\n",n);
return n;
}
}
//删除链表中序号是第i位的元素值(从1开始)
int Del_LinkList(LNode **pLinklist,int i){
int num = 1;
LNode *t,*q = *pLinklist;
if(i<1||i>(*pLinklist)->Length){
printf("输入的i值大于链表的表长,请确认!!\n");
return ERROR;
}
if(1==i){
t = q;
q = q->next;
}else{
while(num<i&&q->next){
q = q->next;
num++;
}
if(num = i&&q->next){
t = q->next;
q->next = t->next;
}
free(t);
}
(*pLinklist)->Length--;
printf("链表中序号是第%d位的元素值是%d!!\n",i,num);
return OK;
}
//遍历该链表
void Travel_LinkList(LNode **pLinkList){
LNode *p = *pLinkList;
if(!p){
printf("链表为空!");
}else if(!p->next){
printf("该链表只有1个元素,值是:%c\n",p->data);
}else{
printf("该链表的元素是:");
while(p->next){
printf("%c、",p->data);
p = p->next;
}
printf("%c、",p->data);//最后一个元素
printf("\n");
}
}
//主函数
int main()
{
LNode *head=NULL; /*定义静态变量*/
int select,x1,x2,x3,x4;
int i,n;
int m,g;
char e,y;
Init_LinkList(&head); /*建链表并设置为空表*/
printf("请输入数据长度: ");
scanf("%d",&n);
// for(i=1;i<n;i++)
{
printf("将数据插入到单链表中: ");
scanf("%d",&y);
Insert_LinkList(&head,y,i); /*插入数据到链表*/
Travel_LinkList(&head); /*显示链表所有数据*/
// printf("select 1 求长度 Length_LinkList()\n");
// printf("select 2 取结点 GetElem2_LinkList()\n");
// printf("select 3 求值查找 Locate_LinkList()\n");
// printf("select 4 删除结点 Del_LinkList()\n");
// printf("input your select: \n");
scanf("%d",&select);
switch(select)
{
case 1:
{
x1=Length_LinkList(&head);
printf("输出单链表的长度%d ",x1);
Travel_LinkList(&head);
}break;
case 2:
{
printf("请输入要取得结点: ");
scanf("%d",&m);
x2=GetElem2_LinkList(&head,m);
printf("%d位置的字符是:%c\n",m,x2);
Travel_LinkList(&head);
}break;
case 3:
{
printf("请输入要查找的数据: ");
scanf("%d",&e);
x3=Locate_LinkList(&head,e);
printf("第一次出现%c字符的位置是%d\n",e,x3);
Travel_LinkList(&head);
}break;
case 4:
{
printf("请输入要删除的结点: ");
scanf("%d",&g);
x4=Del_LinkList(&head,g);
printf("删除第一次出现%c字符的位置是%d\n",g,x4);
Travel_LinkList(&head);
}break;
}
}
return OK;
}