线性链表(面向过程)--2011.11.13

 

#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);
	}
}

你可能感兴趣的:(数据结构,c,线性链表创建与使用)