#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef char ElemType;
typedef struct Node /*结点类型定义*/
{
ElemType data;
struct Node * next;
}Node, *LinkList; void init_linklist(LinkList *l)/*对单链表进行初始化*/
{
*l=(LinkList)malloc(sizeof(Node));
(*l)->next=NULL;
}
void creatlianbiao(LinkList L)
{
Node *s;
char c;
int flag=1;
while(flag)
{
c=getchar();
if(c!='@')
{
s=(Node*)malloc(sizeof(Node)); //建立新节点
s->data=c;
s->next=L->next; //将s节点插入表头
L->next=s;
}
else flag=0;
}
}
Node *Search(LinkList L,ElemType e) // 按值查找
{
Node *p;
p=L->next;
while(p!=NULL)
{
if(p->data!=e)
{
p=p->next; // 指向下一个节点
}
else break;
}
return p;
}
int InsList(LinkList L,int i,ElemType e) // 在带头节点的单链表中第i个位置插入值为e的新节点
{
Node *pre,*s;
pre=L;
int k=0;
if(i<0)
return ERROR;
while(pre!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}
if(!pre) // 相当于pre=null
{
printf("插入的位置不合法!");
return ERROR;
}
s=(Node*)malloc(sizeof(Node)); // 为e申请一个新的节点并由s指向它
s->data=e;
s->next=pre->next;
pre->next=s;
return OK;
}
int DelList(LinkList L,int i,ElemType *e )
{
Node *pre,*r;
int k=0;
pre=L;
while(pre!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}
if(!(pre->next))
{
printf("删除的位置不合理!");
return ERROR;
}
r=pre->next;
pre->next=r->next;
*e=r->data;
free(r);
return OK;
}
void main()
{
LinkList l;
Node *p;
char c;
char *d;
init_linklist(&l);
printf("用头插法建立单链表,请输入链表数据,以@结束!\n");
creatlianbiao(l);
p=l->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("请输入要查找的元素值:\n");
fflush(stdin); //清空输入缓冲区
scanf("%c",&c);
p = Search(l,c);
if(p!=NULL)
printf("该结点的值为:%c\n",p->data);
else
printf("未找到此结点!\n");
int flag=0;
int i;
printf("请输入插入的位置和元素:\n");
scanf("%d,%c",&i,&c);
flag=InsList(l, i, c);
if(flag)
printf("插入操作成功!\n");
else
printf("插入操作失败!\n");
p = l->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n请输入被删元素的位置:");
scanf("%d",&i);
d= (char*)malloc(sizeof(char));
DelList(l,i,d);
printf("被删除的元素是:%c\n",*d);
p = l->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}