天天看點

資料結構之順序表和單連結清單的實作-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語言版

繼續閱讀