
#include<stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define ERROR
#define OK
#define ElemType char
typedef struct Node
{
ElemType data;
struct Node* next;
}Node, *LinkList;
InitList(LinkList *L)
{
* L=(LinkList)malloc(sizeof(Node));
(* L)->next=NULL;
printf("单链表已初始化\n");
}
void GreateFromHead(LinkList L)
{
Node *s;
char c;
int flag=1;
while(flag)
{
c=getchar();
if(c==' ') continue;
if(c!='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
s->next=L->next;
L->next=s;
}
else flag=0;
}
}
Node * Get(LinkList L,int i)
{
int j;
Node *p;
if(i<=0) return NULL;
p=L;j=0;
while(p->next!=NULL&&j<i)
{
p=p->next;
j++;
}
if(i==j) return p;
else return NULL;
}
void InsList(LinkList L,int i,ElemType e)
{
Node *pre,*s;
int k;
if(i<=0)
{
printf("插入位置必须大于0!");
return ERROR;
}
pre=L; k=0;
while(pre!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}
if(pre==NULL)
{
printf("插入位置不合理!");
return ERROR;
}
s=(Node *)malloc(sizeof(Node));
s->data=e;
s->next=pre->next;
pre->next=s;
return OK;
}
int DelList(LinkList L,int i)
{
Node *pre,*r;
int k;
pre=L;k=0;
while(pre->next!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}
if(pre->next==NULL) return NULL;
r=pre->next;
pre->next=r->next;
free(r);
return OK;
}
void main()
{
LinkList l;
Node *p;
int i,choose,cycle=1;
char e;
system("color 2F");
InitList(&l);
while(cycle){
printf("请输入要执行的操作:\n");
printf("\t-----------------------------------------\n");
printf("\t|\t1. 建表 \t\t\t|\n");
printf("\t-----------------------------------------\n");
printf("\t|\t2. 查询 \t\t\t|\n");
printf("\t-----------------------------------------\n");
printf("\t|\t3. 插入 \t\t\t|\n");
printf("\t-----------------------------------------\n");
printf("\t|\t4. 删除 \t\t\t|\n");
printf("\t-----------------------------------------\n");
printf("\t|\t5. 退出 \t\t\t|\n");
printf("\t-----------------------------------------\n");
scanf("%d",&choose);
switch (choose)
{
case 1:
system("cls");
printf("用头插法建立单链表,请输入链表数据,以$结束!\n");
GreateFromHead(l);
p = l->next;
while(p!=NULL)
{
printf("%c ",p->data);
p=p->next;
}
system("pause");
break;
case 2:
system("cls");
printf("请输入要查找的第i个元素:");
scanf("%d",&i);
p=Get(l,i);
if(p==NULL)
{
printf("未查到该元素\n");
system("pause");
continue;
}
printf("查找的第%d元素为:%c \n",i,p->data);
system("pause");
break;
case 3:
system("cls");
printf("请输入插入的位置和元素(请用空格隔开):");
scanf("%d %c",&i,&e);
InsList(l,i,e);
printf("插入后为的链表为:");
p = l->next;
while(p!=NULL)
{
printf("%c ",p->data);
p=p->next;
}
system("pause");
break;
case 4:
system("cls");
printf("请输入要删除的位置:");
scanf("%d",&i);
p=DelList(l,i);
if(p==NULL)
{
printf("删除的位置不合理");
}else{
printf("删除后为的链表为:");
p = l->next;
while(p!=NULL)
{
printf("%c ",p->data);
p=p->next;
}
}
system("pause");
break;
case 5:
cycle=0;
printf("RZH欢迎您再次使用:\n");
break;
default :
printf("输入有误,RZH求您再次输入:\n");
system("pause");
system("cls");
continue;
}
}
}