• int vis[1000]是什么意思
  • 其它

int vis[1000]是什么意思?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#pragma warning(disable:4996)

int vis[1000];


typedef struct ltbl
{
 struct ltbl* pPre;/* 指向链表中前一个元素的指针 */
 struct ltbl* pNxt;/* 指向链表中后一个元素的指针 */
 int nKey;/* KEY VALUE*/
 unsigned char ucDummy[32];/*备用*/
}LTBL;

typedef struct mng
{
 int nNodeCnt;/*链表的长度*/
 LTBL* pHead;/*指向链表头的指针*/
}MNG;


int TBLCreate(MNG* pMng, int nCnt)
{
 memset(vis, 0, sizeof(vis)); //防止随机值重复
 if (!pMng)return -1;
 pMng->nNodeCnt = nCnt;
 LTBL* p = (LTBL*)malloc(sizeof(LTBL)); //创建头节点
 if (!p)return -1;
 int x = 0;
 x = rand() % 1000;
 vis[x] = 1;
 p->nKey = x;
 p->pPre = NULL;
 p->pNxt = NULL;
 pMng->pHead = p;

 for (int i = 1; i < nCnt; ++i) {
   LTBL* temp = (LTBL*)malloc(sizeof(LTBL));
   if (!temp)return -1;
   while (1) { //随机值防止重复
     x = rand() % 1000;
     if (!vis[x]) {
       vis[x] = 1;
       break;
     }
   }
   temp->nKey = x;
   temp->pNxt = NULL;
   temp->pPre = p;//新节点前驱指向当前节点
   p->pNxt = temp;//当前节点的后继为新节点
   p = p->pNxt;//当前节点后移
 }
 return 0;
}

void TBLFree(MNG* pMng) {
 pMng->nNodeCnt = 0;
 LTBL* pre = pMng->pHead;
 while (pre) {
   LTBL* p = pre->pNxt;
   free(pre);
   pre = p;
 }
 pMng->pHead = NULL;
}

LTBL* TBLSearch(const MNG* pMng, int nKey) {
 LTBL* p = pMng->pHead;
 while (p) {
   if (p->nKey == nKey)return p;
   p = p->pNxt;
 }
 return p;
}

int TBLInsert(MNG* pMng, LTBL* pNode) {
 LTBL* p = pMng->pHead;
 LTBL* pre = NULL;
 while (p) {
   if (p->nKey == pNode->nKey)return -1;
   else if (p->nKey < pNode->nKey) {
     pre = p;
     p = p->pNxt;
   }
   else { //按升序排
     pNode->pPre = pre;
     if (pre)pre->pNxt = pNode;//插入节点不会变为头节点
     else pMng->pHead = pNode; //pre为NULL则插入节点变为头节点
     pNode->pNxt = p;
     if(p)p->pPre = pNode;//插入节点不是尾结点
     pMng->nNodeCnt++;
     return 0;
   }
 }
}

int TBLDelete(MNG* pMng, int nKey) {
 LTBL* p = TBLSearch(pMng, nKey); //找到删除节点
 if (!p)return -1;
 LTBL* pre = p->pPre;
 LTBL* next = p->pNxt;
 if (pre)pre->pNxt = next; //删除节点不是头节点
 else pMng->pHead = p->pNxt; //删除节点为头节点
 if (next)next->pPre = pre; //删除节点不是尾节点
 free(p);
 pMng->nNodeCnt--;
 return 0;

}

void TBLSort(MNG* pMng, int nFlg) {
 LTBL* p = NULL;
 LTBL* q = NULL;
 for (p = pMng->pHead; p!=NULL && p->pNxt != NULL; p = p->pNxt) { //冒泡排序
   for (q = p->pNxt; q != NULL; q = q->pNxt) {
     if ((p->nKey < q->nKey) == nFlg) {
       int temp = p->nKey;
       p->nKey = q->nKey;
       q->nKey = temp;
     }
   }
 }
}

void show(MNG* pMng) {
 LTBL* p = pMng->pHead;
 while (p) {
   printf("%d ", p->nKey);
   p = p->pNxt;
 }
 printf("\n");
}

int main() {
 MNG mng;
 mng.pHead = NULL;
 while (1) {
   srand(time(NULL));
   printf("1.新建链表\n");
   printf("2.插入节点\n");
   printf("3.删除节点\n");
   printf("4.查找节点\n");
   printf("5.排序链表\n");
   int choice;
   scanf("%d", &choice);
   if (choice == 6)break;
   switch (choice)
   {
   case 1: {
     printf("请输入想要创建多少节点的链表:\n");
     int cnt;
     scanf("%d", &cnt);
     TBLFree(&mng);
     if (TBLCreate(&mng, cnt) == -1) {
       printf("创建失败,请重试!\n");
     }
     else {
       printf("创建后的链表为:\n");
       show(&mng);
     }
     break;
   }
   case 2: {
     printf("请输入想要插入节点的值:\n");
     LTBL* p = (LTBL*)malloc(sizeof(LTBL));
     p->pNxt = NULL;
     p->pPre = NULL;
     scanf("%d", &p->nKey);
     if (TBLInsert(&mng, p) == -1) {
       printf("插入失败,请重试!\n");
     }
     else {
       printf("插入后的链表为:\n");
       show(&mng);
     }
     break;
   }
   case 3: {
     printf("请输入想要删除节点的值:\n");
     int key;
     scanf("%d", &key);
     if (TBLDelete(&mng, key) == -1) {
       printf("删除失败,请重试!\n");
     }
     else {
       printf("删除后的链表为:\n");
       show(&mng);
     }
     break;
   }
   case 4: {
     printf("请输入想要查找节点的值:\n");
     int key;
     scanf("%d", &key);
     if (!TBLSearch(&mng, key)) {
       printf("没有该节点\n");
     }
     else {
       printf("该节点存在\n");
     }
     break;
   }
   case 5: {
     printf("请输入想要排序的方式(0:升序,1:降序):\n");
     int flag;
     scanf("%d", &flag);
     TBLSort(&mng, flag);
     printf("排序后的链表为:\n");
     show(&mng);
     break;
   }
   default:
     break;
   }
 }
 return 0;
}


  • TIMI    2020-06-16 09:40:51
  • 阅读 872    收藏 0    回答 1
  • 邀请
  • 收藏
  • 分享
发送
登录 后发表评论
  • 51testing软件测试圈微信