当前位置:   article > 正文

线性表的输入、输出、删除和修改之个人通讯录管理系统_输入一个线性表

输入一个线性表

线性表的基本操作:

小牛试刀:

        顺序表中基本的输入、输出之查找第i个数据元素的值:

代码:

  1. #include <stdio.h>
  2. #define LISTSIZE 100
  3. typedef int DateType;
  4. typedef struct {
  5. DateType data[LISTSIZE];
  6. int length;
  7. }SqlList;
  8. void input(SqlList &L, int n)
  9. {
  10. printf("请输入元素:\n");
  11. for (int i = 1; i <= n; i++)
  12. {
  13. scanf("%d", &L.data[i-1]);
  14. }
  15. L.length=n;
  16. printf("\n");
  17. }
  18. void output(SqlList &L, int n)
  19. {
  20. for (int i = 1; i <= n; i++)
  21. {
  22. printf("%-3d", L.data[i-1]);
  23. }
  24. printf("\n");
  25. }
  26. void GetData(SqlList L, int i, int &a)
  27. {
  28. a = L.data[i - 1];
  29. }
  30. int main()
  31. {
  32. int a,num;
  33. SqlList L;
  34. printf("请输入插入的元素:\n");
  35. input(L, 5);
  36. printf("输出的元素是:\n");
  37. output(L, 5);
  38. printf("\n请输入需要查找的元素位置:");
  39. scanf("%d",&num);
  40. GetData(L, num, a);
  41. printf("\n第 %d 个位置元素的值是:%d", num, a);
  42. return 0;
  43. }

效果图:

基础篇:

        完成顺序表的基本操作(如输入、输出、插入操作、删除操作、查找操作等)

代码:

  1. #include <stdio.h>
  2. #define ListSize 100
  3. typedef int DateType; // 把int类型定义成新的类型
  4. typedef struct {
  5. DateType data[ListSize];
  6. int length;
  7. }SeqList;
  8. //输入函数
  9. void input(SeqList &L) {
  10. printf("请输入数据后按回车键确认,若想结束输入请按“#”\n");
  11. printf("***********************************\n");
  12. char num[20];
  13. int sum = 0,i,b,j=0;
  14. printf("请输入元素: ");
  15. gets(num);
  16. if(num[0] == '#') break;
  17. L.length++;
  18. }
  19. }
  20. //删除元素
  21. void deleteData(SeqList &L){
  22. printf("\n请输入删除元素的位置:");
  23. int position;
  24. scanf("%d",&position);
  25. if(position<1 || position>L.length){
  26. printf("删除位置不合法!\n");
  27. return;
  28. }
  29. int number;
  30. number=L.data[position-1];
  31. for(int i=position;i<L.length;i++){
  32. //空间变小,元素需要往前移位
  33. L.data[i-1]=L.data[i];
  34. }
  35. L.length--;
  36. printf("要删除的元素是%d\n",number);
  37. }
  38. //查找(获取)元素
  39. void GetData(SeqList L){
  40. int number;
  41. printf("\n");
  42. printf("请输入要查找的元素:");
  43. scanf("%d",&number);
  44. for(int i=0;i<=L.length;i++){
  45. if(L.data[i]==number){
  46. printf("查找成功!值为%d,位于当前顺序表的第 %d 个位置\n",number,i+1);
  47. break;
  48. }
  49. }
  50. }
  51. //插入元素
  52. void insertList(SeqList &L){
  53. printf("\n请输入插入位置的元素:");
  54. int index;
  55. scanf("%d",&index);
  56. if(index<1 || index>L.length+1){
  57. printf("插入位置不合法!");
  58. return;
  59. }
  60. if(L.length>=ListSize){
  61. printf("线性表已满,无法插入元素!");
  62. return;
  63. }
  64. int num;
  65. printf("\n请输入插入的元素:");
  66. scanf("%d",&num);
  67. //从最后一个元素往后移
  68. for(int k=L.length-1;k>=index-1;k--){
  69. L.data[k+1]=L.data[k];
  70. }
  71. //插入元素num
  72. L.data[index-1]=num;
  73. L.length++;
  74. }
  75. // 输出函数
  76. void output(SeqList L){
  77. printf("\n");
  78. printf("****遍历顺序表中的元素***\n");
  79. for(int i = 1; i<= L.length; i++) {
  80. printf("第%d个元素的值为 %d\n",i,L.data[i-1]);
  81. }
  82. }
  83. int main(){
  84. SeqList L;
  85. L.length=0;
  86. input(L);
  87. output(L);
  88. GetData(L);
  89. insertList(L);
  90. printf("\n插入后的线性表是:");
  91. output(L);
  92. deleteData(L);
  93. printf("\n删除后的线性表是:");
  94. output(L);
  95. return 0;
  96. }

效果图:

加强篇:

        已知线性表La和Lb的元素按值非递减排列,归并La和Lb得到新的线性表Lc,Lc的元素也按值非递减排列。(注:需要使用顺序表和链表分别完成)

代码:

  1. #include <stdio.h>
  2. #define ListSize 100
  3. typedef int DataType;
  4. typedef struct{
  5. DataType data[ListSize];
  6. int length;
  7. }SeqList;
  8. typedef struct Node{
  9. DataType data;
  10. struct Node *next;
  11. }Node,*LinkList;
  12. //顺序表输入
  13. void input_Seqlist(SeqList &L){
  14. printf("请输入数据总量:");
  15. int num;
  16. scanf("%d",&num);
  17. printf("请输入数据:");
  18. int number;
  19. for(int i=1;i<=num;i++){
  20. scanf("%d",&number);
  21. L.data[i-1]=number;
  22. L.length++;
  23. }
  24. }
  25. //顺序表输出
  26. void output_Seqlist(SeqList L){
  27. printf("\n线性表中数据是:\n");
  28. for(int i=1;i<=L.length;i++){
  29. printf("%d)>、%d\t\t",i,L.data[i-1]);
  30. }
  31. printf("\n");
  32. }
  33. //顺序表的合并
  34. void mergeList1(SeqList La,SeqList Lb,SeqList &Lc){
  35. int i=0,j=0,k=0;
  36. while(i<=La.length-1 && j<=Lb.length-1){
  37. if(La.data[i]<=Lb.data[j]){
  38. Lc.data[k]=La.data[i];
  39. i++;
  40. k++;
  41. }else{
  42. Lc.data[k]=Lb.data[j];
  43. j++;
  44. k++;
  45. }
  46. }
  47. while(i<=La.length-1){
  48. Lc.data[k]=La.data[i];
  49. i++;k++;
  50. }
  51. while(j<=Lb.length-1){
  52. Lc.data[k]=La.data[j];
  53. j++;k++;
  54. }
  55. Lc.length=La.length+Lb.length;
  56. }
  57. //使用链表输入
  58. void input_Link(LinkList &L){
  59. int nums,i=1;
  60. printf("请输入数据总量:");
  61. int num;
  62. scanf("%d",&num);
  63. L=new Node;
  64. Node *s,*r=L;
  65. printf("请输入数据元素:");
  66. while(i<=num){
  67. scanf("%d",&nums);
  68. s=new Node;
  69. s->data=nums;
  70. r->next=s;
  71. r=s;
  72. i++;
  73. }
  74. r->next=NULL;
  75. }
  76. //使用链表输出
  77. void ouput_Link(LinkList L){
  78. int i=1;
  79. Node *p;
  80. p=L->next;
  81. while(p!=NULL){
  82. printf("%d)--->%d\t\t",i,p->data);
  83. p=p->next;
  84. i++;
  85. }
  86. printf("\n");
  87. }
  88. //使用链表合并
  89. void mergeList2(LinkList LA,LinkList LB,LinkList &LC){
  90. Node *pa,*pb,*pc;
  91. pa=LA->next;
  92. pb=LB->next;
  93. LC=LA;
  94. pc=LC;
  95. while(pa!=NULL && pb!=NULL){
  96. if(pa->data<=pb->data){
  97. pc->next=pa;
  98. pc=pa;
  99. pa=pa->next;
  100. }else{
  101. pc->next=pb;
  102. pc=pb;
  103. pb=pb->next;
  104. }
  105. }
  106. if(pa){
  107. pc->next=pa;
  108. }else{
  109. pc->next=pb;
  110. }
  111. delete LB;
  112. }
  113. //主函数
  114. int main(){
  115. //初始化
  116. SeqList La,Lb,Lc;
  117. La.length=0;
  118. Lb.length=0;
  119. Lc.length=0;
  120. LinkList LA,LB,LC;
  121. LA=NULL;
  122. LB=NULL;
  123. LC=NULL;
  124. printf("1、使用链表合并\n2、使用顺序表合并\n3、退出程序\n");
  125. int number;
  126. scanf("%d",&number);
  127. if(number==1){
  128. //1、链表合并
  129. printf("\n请输入第一个升序排列的链表ListA\n");
  130. input_Link(LA);
  131. ouput_Link(LA);
  132. printf("\n请输入第二个升序排列的链表ListB\n");
  133. input_Link(LB);
  134. ouput_Link(LB);
  135. mergeList2(LA,LB,LC);
  136. printf("\n使用链表合并成功!\n");
  137. ouput_Link(LC);
  138. }else if(number==2){
  139. //2、顺序表合并
  140. printf("\n请输入第一个升序排列的线性表ListA\n");
  141. input_Seqlist(La);
  142. output_Seqlist(La);
  143. printf("\n请输入第二个升序排列的线性表ListB\n");
  144. input_Seqlist(Lb);
  145. output_Seqlist(Lb);
  146. mergeList1(La,Lb,Lc);
  147. printf("\n使用线性表合并成功!\n");
  148. output_Seqlist(Lc);
  149. printf("SeqListC线性表的长度是:%d",Lc.length);
  150. }else{
  151. printf("退出程序!!!\n");
  152. }
  153. return 0;
  154. }

效果图:

提高篇:

        为方便管理个人通讯录系统,编写一个简单的通讯录管理系统,系统记录必须有姓名、电话号码、QQ号。

需要完成的功能如下:

  1. 输入信息:调用此函数用以输入数据到内存中,此过程包括建立相应的链表或相应的数组,便于读取
  2. 显示信息:用以显示输入的数据
  3. 查找:以姓名作为关键字查找要找的信息
  4. 删除信息:用以删除选定的输入信息(姓名作为关键字)
  5. 修改信息:用以修改选定的输入信息(姓名作为关键字)
  6. 打开通讯录:存储从文件中读取的字符
  7. 添加信息:用尾插法以添加信息
  8. 保存:调用此函数将内存中的数据保存至磁盘中
  9. 清屏:执行cls命令

 改进中......

代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. typedef struct Student{
  5. char name[20]; //姓名
  6. char telephone[20]; //电话号码
  7. int qq[20]; //QQ号
  8. struct Student *next;
  9. }Node;
  10. Node *head;//头指针
  11. //初始化系统界面
  12. void screnn(){
  13. printf("==========欢迎来到个人通讯录管理系统!==========\n");
  14. printf(" 1.输入信息 2.显示信息\n");
  15. printf(" 3.查找信息 4.删除信息\n");
  16. printf(" 5.修改信息 6.添加信息\n");
  17. printf(" 7.保存通讯录 8.显示系统界面\n");
  18. printf(" 9.清屏cls\n");
  19. printf("\n===============输入0退出程序===============\n");
  20. }
  21. // 1 输入信息
  22. void enter()
  23. {
  24. int ans; // 判断是否继续输入
  25. Node *p1, *p2;
  26. p1 =new Node; // 申请内存来用
  27. if (p1 != NULL)
  28. {
  29. printf("========输入数据========\n");
  30. head = p1;
  31. while (1)
  32. {
  33. printf("姓名:");
  34. scanf("%s", &p1->name);
  35. printf("电话号码:");
  36. scanf("%s", &p1->telephone);
  37. printf("QQ号码:");
  38. scanf("%s", &p1->qq);
  39. printf("\n\n");
  40. p2 = p1;
  41. // 申请下一个要用的空间
  42. p1 = new Node;
  43. if (p1 != NULL)
  44. p2->next = p1;
  45. //用户选择
  46. printf("请选择是否继续输入:1.继续 2.退出\n请选择:");
  47. scanf("%d", &ans);
  48. if (ans == 1)
  49. continue;
  50. else
  51. { //退出
  52. printf("\n========输入完成========\n\n");
  53. p2->next = NULL;
  54. //将申请的的无用内存释放
  55. delete(p1);
  56. break;
  57. }
  58. }
  59. }
  60. }

主函数:

  1. int main(){
  2. //显示通讯录系统界面
  3. screnn();
  4. int numbers;
  5. while(1){
  6. printf("请输入你的选择(1~9):");
  7. scanf("%d",&numbers);
  8. printf("\n");
  9. if(numbers<0 || numbers>9){
  10. printf("输入有误!");
  11. continue;
  12. }
  13. switch(numbers){
  14. case 0:
  15. printf("\n==========欢迎你再次使用个人通讯录管理系统!==========\n");
  16. //退出系统
  17. exit(1);
  18. break;
  19. case 1:
  20. //1输入信息
  21. enter();
  22. break;
  23. case 2:
  24. //2显示信息
  25. display(head);
  26. break;
  27. case 3:
  28. //3查找信息
  29. search(head);
  30. break;
  31. case 4:
  32. //4删除信息
  33. deleted();
  34. break;
  35. case 5:
  36. //5修改信息
  37. update(head);
  38. break;
  39. case 6:
  40. //6添加信息
  41. insert();
  42. break;
  43. case 7:
  44. //7保存通讯录
  45. save(head);
  46. break;
  47. case 8:
  48. //显示通讯录系统界面
  49. screnn();
  50. break;
  51. case 9:
  52. //8清屏
  53. cls();
  54. break;
  55. default:
  56. printf("输入有误!请重新输入!");
  57. break;
  58. }
  59. }
  60. return 0;
  61. }

 效果图:

 

有问题可以随时联系小编!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/559395
推荐阅读
相关标签
  

闽ICP备14008679号