对之前一次的链表进行了改进
#include <stdio.h>
#include <stdlib.h>
typedef char datatype;
typedef struct list
{
datatype data;
struct list *next;
}node;
node *head = NULL, *r;
void creat() // 尾插法建表,带有头结点
{
node *s;
char x;
printf("请输入一串字符串以#结束\n");
head = (node *)malloc(sizeof(node));
r = head;
x = getchar();
while (x!='#')
{
s = (node *)malloc(sizeof(node)); // 申请头结点
s->data = x;
r->next = s; //新节点插入表尾
r = s; // 尾节点指向新的表尾
x = getchar();
}
r -> next = NULL;
printf("创建成功\n");
}
node *index(int n, datatype x) // 插入
{
int i = 1;
node *p ,*s;
p = head;
if (!head)
{
printf("请先建表\n");
return NULL;
}
while (i<n && p->next!=NULL)
{
i++;
p = p->next;
}
if (i != n)
{
printf("你输入的位置有错\n");
return NULL;
}
s = (node *)malloc(sizeof(node));
s->data = x;
s->next = p->next;
p->next = s;
printf("插入成功\n");
return NULL;
}
node *detele(datatype x) // 删除节点
{
node *p, *r, *q;
p = head; // 跑的慢的指针
q = head->next; //跑的快的指针
while (q->data != x && q->next != NULL)
{
q = q->next;
p=p->next;
}
if (q->data != x)
{
printf("该节点不存在\n");
return NULL;
}
r = p->next;
p ->next = r->next;
free(r);
printf("删除成功\n");
return NULL;
}
int show() // 显示表长
{
node *p;
p = head;
if (!head)
{
printf("请先建表\n");
return 0;
}
while (p->next!=NULL)
{
p = p->next;
printf("%c ",p->data);
}
printf("\n");
return 0;
}
int search(datatype x) // 按位置查询
{
int i = 0;
node *p;
p = head;
if (!head)
{
printf("请先建表\n");
return 0;
}
while (p->data != x && p->next != NULL)
{
p = p->next;
i++;
}
if (p->data == x) // 不算头结点
{
printf("该节点在第%d\n",i);
}
else
{
printf("该节点不存在\n");
return 0;
}
return 0;
}
int listnum() //求表长
{
int n = 0;
node *p;
p = head; // 指向第一个元素
if (!head)
{
printf("请先建表\n");
return 0;
}
while (p->next)
{
n++;
p = p->next;
}
return n;
}
int main()
{
while (1)
{
int i ;
printf("*********************************\n");
printf("*\t 1\t建表\t\t*\n");
printf("*\t 2\t插入\t\t*\n");
printf("*\t 3\t删除\t\t*\n");
printf("*\t 4\t显示\t\t*\n");
printf("*\t 5\t查询\t\t*\n");
printf("*\t 6\t求表长\t\t*\n");
printf("*\t 0\t返回\t\t*\n");
printf("*********************************\n");
printf("请输入一个数字\n");
scanf("%d",&i);
getchar(); // 吸收回车
if (i == 1)
{
creat();
}
else if (i == 2) // 插入
{
int locate;
char x;
printf("请输入要插入的位置和元素(4,a)\n"); // 注意要是不按格式输入的情况
scanf("%d,%c",&locate,&x); // 取地址符别忘加了
index(locate,x);
}
else if (i == 3) // 删除
{
datatype x;
if (!head)
{
printf("请先建表\n");
continue;
}
printf("请输入要删除的值");
scanf("%c",&x);
detele(x);
}
else if (i == 4)// 显示
{
show();
}
else if (i == 5) //
{
datatype x;
printf("请输入要查找的值\n");
scanf("%c",&x);
search(x);
}
else if (i == 6) // 表长
{
printf("表长为:%d\n",listnum());
}
else if (i == 0)
return 0;
else
printf("你输入的有错\n");
}
return 0;
}