线性表的基本操作

实现线性表的基本操作。其中有点错误,但不知道怎么改,还希望高手不吝赐教。

#include<malloc.h>

#include<string.h>

#include<stdio.h>

 

#defineMAX_LENGTH          256

 

int giListSize = 1;

//

//链表中结点类型为以顺序表存储的字符串

typedef struct NODE

{

      char name[MAX_LENGTH];

      int last;

      struct NODE *next;

}NODE;

//

//打印链表中所有结点(一行一个)

void print_list(NODE *pListHead)

{

      NODE *pTemp =pListHead;

      while (pTemp) {

             printf("%s/n",pTemp->name);

             pTemp =pTemp->next;

      }

}

//

//销毁链表

void destroy_list(NODE *pListHead)

{

      NODE **pNodes = (NODE**)malloc(giListSize*sizeof(NODE*));

      NODE *pTemp =pListHead;

      int i = 0;

      while (pTemp) {

             pNodes[i++] =pTemp;

             pTemp =pTemp->next;

      }

      for (i=(giListSize-1);i>=0;i--)

             free(pNodes[i]);

      free(pNodes);

}

//

//插入一个字符到一个链表结点中

int insert_char(NODE *pNode,int i,char c)

{

      if (!pNode ||i<1 ||i>pNode->last+1 ||pNode->last>=MAX_LENGTH)

             return 0;

 

      for (int m=pNode->last;m>=i;m--)

             pNode->name[m] =pNode->name[m-1];

      pNode->name[i-1] =c;

      pNode->last++;

      pNode->name[pNode->last] = '/0';

 

      return 1;

}

//

//删除结点中的一个字符

int delete_char(NODE *pNode,int i)

{

      if (!pNode ||i<1 ||i>pNode->last ||pNode->last==0)

             return 0;

      

      for (int m=i;m<pNode->last;m++)

             pNode->name[m-1] =pNode->name[m];

      pNode->last--;

      pNode->name[pNode->last] = '/0';

 

      return 1;

}

//

//查找链表的第i个结点

NODE *get_node(NODE *pListHead,int i)

{

      int m;

      NODE *pResult =pListHead;

      if (!pResult ||i<0)

             return NULL;

 

      for (m=0;m<i &&pResult;m++)

             pResult =pResult->next;

 

      return pResult;

}

//

//插入一个结点到链表第i个结点之前

int insert_node(NODE *pListHead,char *pName,int i)

{

      NODE *pTemp, *pNode = (NODE*)malloc(sizeof(NODE));

      if (!pListHead|| !pName ||i<0 || !pNode)

             return 0;

 

      strcpy(pNode->name,pName);

      pNode->last =strlen(pName);

 

      pTemp =get_node(pListHead,i-1);

      if (!pTemp)

             return 0;

 

      pNode->next =pTemp->next;

      pTemp->next =pNode;    

      giListSize++;

 

      return 1;

}

//

//删除链表中的第i个结点

int delete_node(NODE *pListHead,int i)

{

      NODE *pTemp, *pNode;

      if (!pListHead||i<0)

             return 0;

 

      pTemp =get_node(pListHead,i-1);

      if (!pTemp)

             return 0;

 

      pNode =pTemp->next;

      if (pNode) {

             pTemp->next =pNode->next;

             free(pNode);

      }

      giListSize--;

 

      return 1;

}

int con_node(NODE *pListHead,int j,int k)

{

      NODE *pTemp1,*pTemp,*pNode,*pTemp2 ;

      if (!pListHead|| j<0 ||k<0||j==k)

             return 0;

      

      pTemp1= get_node(pListHead, j);

   //char *c= pTemp1->name;

   pTemp2= get_node(pListHead, k);

      //char *d= pTemp2->name;

   strcat(pTemp1->name,pTemp2->name);

   delete_node(pListHead, k);

  return 1; 

}

 

int main()

{

      int iChoice,iNIndex,iCIndex;

      char cChar;

      char name[MAX_LENGTH];

      NODE *pTemp =NULL;

      //

      //创建头结点

      NODE *pListHead = (NODE*)malloc(sizeof(NODE));

      if (!pListHead)

             return 0;

 

      strcpy(pListHead->name, "head");

      pListHead->last = 4;

      pListHead->next =NULL;

      //

      //插入两节点,打印链表

      strcpy(name, "data");

      insert_node(pListHead,name,giListSize);

      strcpy(name, "structure");

      insert_node(pListHead,name,giListSize);      

      printf("/n********欢迎使用线性表操作演示程序!********/n当前链表结点依次为:/n");

      print_list(pListHead);

      //

      //功能演示

DEMO:

      printf("/n请按编号选择以下功能========>/n1.插入一个字符到一个结点中。/n2.删除一个结点中的字符。/n3.插入一个结点到链表中。/n4.删除链表中的一个结点。/n5.退出程序。/n<============================/n你的选择:");

      scanf("%d", &iChoice);

      switch (iChoice) {

      case 1://插入一个字符到一个结点中

             printf("请依次输入结点编号、字符插入位置与插入的字符:/n");

             scanf("%d %d %c", &iNIndex, &iCIndex, &cChar);

             pTemp =get_node(pListHead,iNIndex);

             insert_char(pTemp,iCIndex,cChar);

             break;

      case 2://删除一个结点中的字符

             printf("请依次输入结点编号、欲删除字符的位置:/n");

             scanf("%d %d", &iNIndex, &iCIndex);

             pTemp =get_node(pListHead,iNIndex);

             delete_char(pTemp,iCIndex);

             break;

      case 3://插入一个结点到链表中

             printf("请依次输入欲插入结点的编号和名字:/n");

             scanf("%d %s", &iNIndex,name);

             insert_node(pListHead,name,iNIndex);

             break;

      case 4://删除链表中的一个结点

             printf("请依次输入欲删除结点的编号:/n");

             scanf("%d", &iNIndex);

             delete_node(pListHead,iNIndex);

             break;

case 5

             printf("请输入两个结点的编号:/n");

             scanf("%d %d", &n,&m);

             con_node(pListHead,n,m);

             break;

      case 6 :/退出程序

             goto EXIT;

      default:

             printf("/n无此项功能。/n");

            goto EXIT;

      }

 

      printf("/n当前链表结点依次为:/n");

      print_list(pListHead);

      goto DEMO;//循环

 

EXIT:

      destroy_list(pListHead);

      printf("/n********感谢使用,下次再见!!!********/n/n");

      return 1;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 C 语言线性表基本操作代码: #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 // 线性表的最大长度 typedef int ElemType; // 定义线性表元素类型为整型 typedef struct { ElemType data[MAXSIZE]; // 存储线性表元素的数组 int length; // 线性表的当前长度 } SqList; // 顺序存储结构的线性表 // 初始化线性表 void InitList(SqList *L) { L->length = 0; // 线性表长度为0 } // 判断线性表是否为空 int ListEmpty(SqList L) { return L.length == 0; } // 获取线性表长度 int ListLength(SqList L) { return L.length; } // 获取线性表中指定位置的元素 int GetElem(SqList L, int i, ElemType *e) { if (i < 1 || i > L.length) { return 0; // i值不合法 } *e = L.data[i - 1]; // 将第i个元素的值赋给e return 1; } // 在线性表中查找指定元素的位置 int LocateElem(SqList L, ElemType e) { for (int i = 0; i < L.length; i++) { if (L.data[i] == e) { return i + 1; // 返回元素在线性表中的位置 } } return 0; // 没有找到元素 } // 在线性表中插入元素 int ListInsert(SqList *L, int i, ElemType e) { if (i < 1 || i > L->length + 1) { return 0; // i值不合法 } if (L->length >= MAXSIZE) { return 0; // 线性表已满 } for (int j = L->length; j >= i; j--) { L->data[j] = L->data[j - 1]; // 将第i个元素及之后的元素后移 } L->data[i - 1] = e; // 将新元素插入到第i个位置 L->length++; // 线性表长度加1 return 1; } // 在线性表中删除元素 int ListDelete(SqList *L, int i, ElemType *e) { if (i < 1 || i > L->length) { return 0; // i值不合法 } *e = L->data[i - 1]; // 将第i个元素的值赋给e for (int j = i; j < L->length; j++) { L->data[j - 1] = L->data[j]; // 将第i个元素之后的元素前移 } L->length--; // 线性表长度减1 return 1; } // 打印线性表中的所有元素 void PrintList(SqList L) { for (int i = 0; i < L.length; i++) { printf("%d ", L.data[i]); } printf("\n"); } // 测试线性表基本操作 int main() { SqList L; InitList(&L); ListInsert(&L, 1, 1); ListInsert(&L, 2, 2); ListInsert(&L, 3, 3); ListInsert(&L, 4, 4); ListInsert(&L, 5, 5); printf("线性表中的元素为:"); PrintList(L); int e; GetElem(L, 3, &e); printf("线性表中第3个元素为:%d\n", e); printf("元素2在线性表中的位置为:%d\n", LocateElem(L, 2)); ListDelete(&L, 4, &e); printf("删除线性表中第4个元素后,线性表中的元素为:"); PrintList(L); printf("线性表的长度为:%d\n", ListLength(L)); return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值