#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10
#define ElemType char
#define OK 1
#define ERROR 0
//结点类型定义
typedef struct Node
{
ElemType data;
struct Node *next;
}Node,*LinkList;//LinkList为结构体指针类型
//初始化单链表
void init_list(LinkList *H)
{
*H=(LinkList)malloc(sizeof(Node));//建立头结点
(*H)->next=NULL; //建立空的单链表
}
//删除链表
void ListDestory(LinkList H)
{
printf("删除链表\n");
Node *q;
while(H){
q=H->next;
free(H);
H=q;
}
printf("删除成功!\n");
}
//计算单链表的长度
int list_len(LinkList H)
{
Node *p;
int j=0;
p=H->next;
while(p!=NULL)
{
p=p->next;
j++;
}
return j;
}
//用尾插法建立单链表
int create_from_tail(LinkList H)
{
Node *r,*s;
char c;
int flag=1;//设置标志位,控制建表结束
r=H;//动态指向当前链表尾部,便于尾插入,初值指向头结点
while(flag)
{
c=getchar();
if(c!='$')
{
s=(Node *)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;//将最后一个结点的next置为空,表示链表结束
}
}
printf("\n");
return(OK);
}
//按序输出元素
void print_out(LinkList H)
{
Node *p;
p=H->next;//从第一个结点开始
while(p!=NULL)
{
printf("%c ",p->data);
p=p->next;
}
printf("\n");
}
//按序号查找元素
Node *get(LinkList H,int i)
{
int j;
Node *p;
p=H;j=0;
while(p->next!=NULL&&j<i)
{
p=p->next;
j++;
}
if(i==j)
{
return p;
}
else
{
return NULL;
}
}
//按值查找元素
int locate(LinkList H,ElemType key)
{
Node *p;
int j=0;
p=H->next;//从第一个结点查找
while(p!=NULL)
{
if(p->data!=key)
{
j++;
p=p->next;
}
else break;
}
if(p==NULL)
{
printf("未找到元素!");
return(ERROR);
}
else
{
printf("此元素位于第%d个节点",j+1);//打印出元素的结点
return(OK);
}
}
//插入元素
int ins_list(LinkList H,int i,ElemType e)
{
Node *pre,*s;
int L;
L=list_len(H);
pre=get(H,i-1);//调用get函数,找到第i-1个结点
if(pre==NULL)
{
printf("插入位置不合理");
printf("\n");
return(ERROR);
}
else
{
s=(Node *)malloc(sizeof(Node));//新建s结点
s->data=e;//将插入数据赋给s的数据域
s->next=pre->next;//完成插入
pre->next=s;
printf("插入后的链表数据:");
print_out(H);//输出插入后的链表数据
return(OK);
}
}
//删除元素
int del_list(LinkList H,int i, char *e)
{
Node *pre,*s;
pre=get(H,i-1);//调用get函数,找到第i-1个结点
if(pre==NULL)
{
printf("删除位置不合理");
printf("\n");
return(ERROR);
}
else
{
s=pre->next;
pre->next=pre->next->next;//删除结点
*e=s->data;
printf("删除的元素是:%c",*e);
printf("\n");
printf("删除后的链表:");
print_out(H);//输出删除后的结点
free(s);//释放被删除的结点
return(OK);
}
}
//倒序排列元素
void printRevList(LinkList H){
if (H->next != NULL)
printRevList(H->next);
printf("%c ",H->data);
}
//主方法
int main()
{
LinkList H;
int a,d,f;
char b,c,e='m';
init_list(&H);//初始化
printf("用尾插法建立链表,请输入链表数据,以$结束(数据之间不要加空格):\n");
create_from_tail(H);//尾插法建表
printf("输出链表数据:\n");
print_out(H);//输出链表
printf("\n");
printf("请输入需查找的节点:");
scanf("%d",&a);
if(get(H,a)==NULL) //按结点查找
{
printf("未找到此节点");
printf("\n");
return(ERROR);
}
else printf("查找到的元素:%c",*get(H,a));
printf("\n");
printf("请输入要查找的元素值:");
getchar();
scanf("%c",&b);
locate(H,b);//按值查找
printf("\n");
printf("请输入要插入的位置和元素,[hint:输入两个数据之间有逗号]:");
getchar();
scanf("%d,%c",&d,&c);
ins_list(H,d,c);//插入
printf("请输入要删除的位置:");
getchar();
scanf("%d",&f);
del_list(H,f,&e);//删除
//倒序排列元素
printf("倒序排列元素:");
printRevList(H);
printf("\n");
//删除链表
ListDestory(H);
return(OK);
}
有表头结点的链栈的基本操作 C语言
最新推荐文章于 2023-03-16 09:42:47 发布