线性链表(面临过程)-2011.11.13
线性链表(面向过程)--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); } }