天天看点

数据结构之顺序表和单链表的实现-C语言版数据结构之顺序表和单链表的实现-C语言版

数据结构之顺序表和单链表的实现-C语言版

一、顺序表

1.顺序表的创建

//Authors:xiaobei
void CREATE(SqList *L)
   { 
  int i;
     printf("请输入学生的个数:");
     scanf("%d",&L->length);
     for(i=0;i<L->length;i++)
     {  
   printf("第%d个学生信息:\n",i+1);
   printf("学号:");
   scanf("%d",&L->stu[i].stu_num);
   printf("姓名:");
   scanf("%s",L->stu[i].name);
     }
  printf("OK");
}
           

2.顺序表查找

//Authors:xiaobei
void LOCATE(SqList L)
{     
 int i=0;
 int number;
 printf("\n请输入要查找学生的学号:");  
    scanf("%d",&number);
 while(i<=L.length-1 && L.stu[i].stu_num!=number)
  i++;
 if(i<=L.length-1)
  printf("学生位置为:%d",i+1);
 else 
  printf("学生信息不存在!");
}
           

3.顺序表的插入

//Authors:xiaobei
void INSERT(SqList *L)
{   
 int i,j;
 Data e;
 printf("\n请输入插入位置(1<=n<=%d):",L->length+1);
 scanf("%d",&i);
    if(L->length==MAXSIZE) 
  printf("数据已满!\n");
    else if 
  (i<1||i>L->length +1)
  printf("输入位置错误!\n");
    else
 {
  {
   printf("学号:");
   scanf("%d",&e.stu_num);
   printf("姓名:");
   scanf("%s",e.name);
  }
  for(j=L->length-1;j>=i-1;j--)
   L->stu[j+1] = L->stu[j];
   L->stu[i-1] = e;
         L->length++;
 }
 printf("\nOK\n");
}
           

4.顺序表的删除

//Authors:xiaobei
void DELETE(SqList *L)
{
 int i,j;
 Data elem;
 printf("\n请输入要删除的元素的位置(1<=n<=%d):",L->length);
 scanf("%d",&i);
 if (L->length==0)
  printf("空表!\n");
 else if(i<1||i>L->length)
  printf("输入位置错误!\n");
 else
 { 
  elem = L->stu[i-1];
  for(j=i;j<=L->length-1;j++)
           L->stu[j-1] = L->stu[j];
  L->length--;
 }
 printf("OK");
}
           

5.顺序表的显示

//Authors:xiaobei
void PRINT(SqList L)
{
 int i;
 printf("学号\t\t姓名\n");
 for(i=0;i<L.length;i++)
  printf("%d\t\t%s\n",L.stu[i].stu_num,L.stu[i].name);
}
           

6.代码补全

//Authors:xiaobei
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100

struct Data
{
 char name[10];
 int stu_num;
};

typedef struct
{ 
 int length;
 Data stu[MAXSIZE];
}SqList;
//指定SqList为上述结构体的类型名,与结构体的定义相同

void MENU_PRINT();
void CREATE(SqList *L);
void INSERT(SqList *L);
void PRINT(SqList L);
void DELETE(SqList *L);
void LOCATE(SqList L);
//****************主函数****************
void main()
{
 SqList Stu_Data;
    while(1)
 {
  int k;
  MENU_PRINT();
  scanf("%d",&k);
  switch(k)
  {
  case 0:exit(0);break;
  case 1:CREATE(&Stu_Data);break;
  case 2:INSERT(&Stu_Data);break;
        case 3:DELETE(&Stu_Data);break;
        case 4:LOCATE(Stu_Data);break;
  case 5:PRINT(Stu_Data);
    };
 }
}
//***********************************
//打印菜单
void MENU_PRINT()
{
 printf("\n******************
   \n*  1.创建顺序表  *
   \n*  2.插入元素    *
   \n*  3.删除元素    *
   \n*  4.查找元素    *
   \n*  5.显示顺序表  *
   \n*  0.结束程序运行*
   \n* 请输入您的选择 *
   \n******************
   \n>>>");
}
           

7.运行结果

数据结构之顺序表和单链表的实现-C语言版数据结构之顺序表和单链表的实现-C语言版

二、单链表

1.单链表的初始化和创建

//Authors:xiaobei
//单链表的初始化
void Status_InitList(LinkList L)
{
 L = (LNode*) malloc(sizeof(LNode));  
 //生成新结点作为头结点,用头指针L指向头结点
 L->next = NULL;
 printf("成功分配存储空间!\n");
}
//单链表的创建
void CreateList_H(LinkList *Li,int n)
{
 int i;
 LNode *p = NULL;
 {
  *Li = (LNode*) malloc(sizeof(LNode));
  (*Li)->next = NULL;
  printf("单链表初始化成功!\n……\n");
 }
 for(i=n;i>0;i--)
 {
  p = (LNode*) malloc(sizeof(LNode));
  printf("请输入链表元素%d:",i);
  scanf("%d",&p->data);
  p->next = (*Li)->next;
  (*Li)->next = p;
 }
 printf("单链表创建成功!\n……\n");
}
           

2.单链表的取值

//Authors:xiaobei
void Status_GetElem(LinkList L,int i)
{
 int j = 1;
 LNode *p;
 p = L->next;
 while(p && j<i)
 {
  p = p->next;
  ++j;
 }
 if(!p || j>i)
  printf("位置有误!\n");
 else
  printf("取值成功!该值为:%d\n",p->data);
}
           

3.单链表的查找

//Authors:xiaobei
void LocateElem(LinkList L,int e)
{
 int i = 1;
 LNode *p = NULL;
 p = L->next;
 while(p && p->data!=e)
 { 
  p = p->next;
  i++;
 }
 if(i>4 || p->data!=e)
  printf("元素不存在!\n");
 else
  printf("该元素位置为:%d\n",i);
}
           

4.单链表的插入

//Authors:xiaobei
void Status_ListInsert(LinkList *Li,int i,int e)
{
 LinkList s;
 LNode *p = NULL;
 int j;
 p = *Li;
 j = 0;
 while(p && (j<i-1))
 {
  p = p->next;
  ++j;
 }
 if(!p||j>i-1)
  printf("输入位置错误!\n");
 else
 {
  s = (LNode*) malloc(sizeof(LNode));
  s->data = e;
  s->next = p->next;
  p->next = s;
  printf("元素插入成功!\n");
 }
}
           

5.单链表的删除

//Authors:xiaobei
void Status_ListDelete(LinkList *Li,int i)
{
 LNode *p = NULL,*q = NULL;
 int j;
 p = *Li;
 j = 0;
 while((p->next) && (j<i-1))
 {
  p = p->next;
  ++j;
 }
 if(!(p->next)||(j>i-1))
  printf("删除位置不合理!\n");
 else
 {
  q = p->next;
  p->next = q->next;
  free(q);
  printf("删除成功!\n");
 }
}
           

6.单链表的显示

//Authors:xiaobei
void Print_List(LinkList L)
{
 LNode *p = NULL;
 p = L->next;
 printf("链表元素为:");
 while(p)
 {
  printf("%d,",p->data);
  p = p->next;
 }
 printf("\n");
}
           

7.代码补全

//Authors:xiaobei
#include<stdio.h>
#include<stdlib.h>

typedef struct LNode
{
 int data;
 struct LNode *next;
}LNode,*LinkList;

void Status_InitList(LinkList L);
void Status_GetElem(LinkList L,int i);
void LocateElem(LinkList L,int e);
void Status_ListInsert(LinkList *Li,int i,int e);
void Status_ListDelete(LinkList *L,int i);
void CreateList_H(LinkList *Li,int n);   
//前插法创建,输入顺序和逻辑顺序相反,所以需要逆序输入
void Print_List(LinkList L);
int Link_Length(LinkList L);
void Print_Menu();

void main()
{
 int i,n = 4,e,user;
 LinkList L = NULL;
 LinkList *Li = &L;
 CreateList_H(Li,n);
 while(1)
 {
  Print_Menu();
  scanf("%d",&user);
  if(user>5 || user<0)
   printf("输入选项有误!");
  else 
   switch(user)
  {
   case 1:{
    printf("请输入取值位置(0-4):");
    scanf("%d",&i);
    Status_GetElem(L,i);
    break;
       }
   case 2:{
    printf("请输入要查找的元素:");
    scanf("%d",&e);
    LocateElem(L,e);
    break;
       }
   case 3:{
    printf("请输入要插入的元素:");
    scanf("%d",&e);
    printf("请输入要插入的位置(1-%d):",Link_Length(L)+1);
    scanf("%d",&i);
    Status_ListInsert(Li,i,e);
    break;
       }
   case 4:{
    printf("请输入要删除的元素位置(1-%d):",Link_Length(L));
    scanf("%d",&i);
    Status_ListDelete(Li,i);
    break;
       }
   case 5:Print_List(L);break;
   case 0:exit(0);
  };
 }
}

void Print_Menu()
{
 printf("\n**********************
  \n 1.单链表取值
  \n 2.单链表查找
  \n 3.单链表插入
  \n 4.单链表删除
  \n 5.显示单链表
  \n 0.退出
  \n(请输入序号0-5)
  \n**********************
  \n>>>");
}

//找到链表长度
int Link_Length(LinkList L)
{
 int i = 0;
 LNode *p = NULL;
 p = L->next;
 while(p)
 {
  p = p->next;
  i++;
 }
 return i;
}
           

8.运行结果

数据结构之顺序表和单链表的实现-C语言版数据结构之顺序表和单链表的实现-C语言版

继续阅读