#include<stdio.h>
#include<string>
#include<stdlib.h>
#define MAX 10
typedef struct Node
{
char cData[MAX];
struct Node *pNext;
}*Linklist;
int nChoice();
void vInitLink(Linklist *H1);//&H
void vCreatLinkHead(Linklist H1,char cLine[]);
void vChanceShow(Linklist H1);
void vShow(Linklist H1);
void vInLink(Linklist H1,int nPos,char cIn[]);
void vDelLink(Linklist H1,int nPos);
int main()
{
int nInPos;
int nDelPos;
int nOption;
Linklist H;
char cInData[MAX];
char cLetters[MAX];//链表节点个数可以不确定
nOption = 1;
while((nOption>0) && (nOption<7))
{
nOption = nChoice();
switch(nOption)
{
case 1:
vInitLink(&H);
printf("请输入字符串(以-1结束):\n");
while((scanf("%s",&cLetters) != EOF) && (strcmp(cLetters,"-1") != 0))//字符串不能用相等来表示=
{
vCreatLinkHead(H,cLetters);//&H这里H已经是指针了
}
vChanceShow(H);
break;
case 2:
while(printf("请输入要插入的位子(以-1结束):\n") && (1 == scanf("%d",&nInPos)) && (nInPos != -1))
{
printf("请输入要插入的值:\n");
scanf("%s",&cInData);
vInLink(H,nInPos,cInData);
vChanceShow(H);
}
break;
case 3:
while((printf("请输入要删除的位子(以-1结束):\n")) && (1 == scanf("%d",&nDelPos)) && (nDelPos != -1))
{
vDelLink(H,nDelPos);
vChanceShow(H);
}
break;
case 5:
vShow(H);
break;
case 6:
exit(0);
break;
default:
break;
}
}
return 0;
}
//选择函数
int nChoice()
{
int nOption;
printf("输入选项:\n1、创建数据\n2、插入数据\n3、删除数据\n4、查找数据\n5、输出数据\n6、退出\n");
scanf("%d",&nOption);
return nOption;
}
//初始化链表
void vInitLink(Linklist *H1)
{
*H1 = (Linklist)malloc(sizeof(Node));
(*H1)->pNext = NULL;
}
//创建链表(头插法)
void vCreatLinkHead(Linklist H1,char cLine[])
{
Node *pX;
pX = (Node*)malloc(sizeof(Node));
strcpy(pX->cData , cLine);
pX->pNext = H1->pNext;//i=0时,相当于pX->pNext = NULL;
H1->pNext = pX;
//free(pX);删除的时候才需要
}
//选择是否要显示数据(链表内容)
void vChanceShow(Linklist H1)
{
bool bIsShow;
printf("\n如果要看存储的内容,请输入1,否则输入0:\n");
scanf("%d",&bIsShow);
printf("\n");
if(1 == bIsShow)
{
vShow(H1);
}
}
//显示链表
void vShow(Linklist H1)
{
Node *pX;
pX = (Node*)malloc(sizeof(Node));
pX = H1;
while(pX->pNext != NULL)
{
pX = pX->pNext;
printf("%s\n",pX->cData);
}
printf("\n");
}
//插入节点(已知插入的位置和值)
void vInLink(Linklist H1,int nPos,char cIn[])
{
int i;
Node *pX,*pPre;
i = 0;
pPre = H1;
pX = (Node*)malloc(sizeof(Linklist));
while((pPre->pNext != NULL) && (i < nPos-1))
{
pPre = pPre->pNext;
i++;
}
if(i != nPos-1)
{
printf("插入位置有误!");
}
else
{
strcpy(pX->cData,cIn);
pX->pNext = pPre->pNext;
pPre->pNext = pX;
}
}
//删除节点(已知删除的位置)
void vDelLink(Linklist H1,int nPos)
{
int i;
Node *pX,*pPre;
i = 0;
pPre = H1;
pX = (Node*)malloc(sizeof(Linklist));
while((pPre->pNext !=NULL) && (i < nPos-1))
{
pPre = pPre->pNext;
i++;
}
if((i != nPos-1) || (pPre->pNext == NULL))
{
printf("删除位置有误\n\n");
}
else
{
pX = pPre->pNext;
pPre->pNext = pPre->pNext->pNext;
free(pX);
}
}