数据结构试验-Sqlist

    第二次试验Sqlist,简单写的没有严格的测试,可以把ElemType改成char,int和double的三种,其他变量需要修改下代码。功能不全有bug还望大家指出。(dev-cpp)

main函数中调用:

#include <stdio.h>
#include "Sqlist.h"
int main()
{
  int i,elem,s[]={13,5,27,9,32,123,76,98,54,87};
  int a[]={1,3,4,5,9,100,101},b[]={2,2,5,8,12,50,102};
  PSqList list,lista,listb,listc;
  
  InitList(&list);
  DispList(list);
  
  for(i=0;i<10;i++)
     ListInsert(list,ListLength(list)+1,s[i]);
  
  DispList(list);
  printf("\nlength:%d\n",ListLength(list));
  for(i=1;i<=3;i++)
  {
     GetElem(list,i,&elem);
     printf("%d ",elem);
  }
  printf("\n76 at %d\n",LocateElem(list,76));
  ListInsert(list,4,56);
  printf("length:%d\n",ListLength(list));
  ListDelete(list,7,&elem);
  SortList(list);
  DispList(list);
  DestroyList(list);
  
  InitList(&lista);
  InitList(&listb);
  for(i=0; i<7; i++)
  {
     ListInsert(lista,ListLength(lista)+1,a[i]);
     ListInsert(listb,ListLength(listb)+1,b[i]);
  }
  printf("\n");
  DispList(lista);
  printf("\n");
  DispList(listb);
  printf("\n");
  listc=UnionList(lista,listb);
  DispList(listc);
  printf("\n");
  return 0;
}

Sqlist.h的内容:

#ifndef __SQLIST_H_
#define __SQLIST_H_ 1

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10

typedef int ElemType;
typedef struct T{
  ElemType *elem;
  int      length;
  int      listsize;
}SqList,*PSqList;

void InitList(PSqList* list);
void DestroyList(PSqList list);
int  ListLength(PSqList list);
void PriorElem(PSqList list,ElemType cur_e,ElemType* pre_e);
void NextElem(PSqList list,ElemType cur_e,ElemType* next_e);
void DispList(PSqList list);
int  GetElem(PSqList list,int i,ElemType* e);
int  LocateElem(PSqList list,ElemType e);
void ListInsert(PSqList list,int i,ElemType e);
void ListDelete(PSqList list,int i,ElemType* e);
void ClearList(PSqList list);
void print(ElemType e);
PSqList UnionList(PSqList lista,PSqList listb);
void SortList(PSqList list);
#endif

Sqlist.c的内容:

void InitList(PSqList* list){
  (*list)=(PSqList)malloc(sizeof(SqList));
  (*list)->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
  if(*list==NULL) printf("error");
  (*list)->length = 0;
  (*list)->listsize = LIST_INIT_SIZE*sizeof(ElemType);
   memset((*list)->elem,0,sizeof((*list)->elem));
}
void DestroyList(PSqList list){
  free(list->elem);
  free(list);
}
int  ListLength(PSqList list){
  return list->length;
}
void PriorElem(PSqList list,ElemType cur_e,ElemType* pre_e){
  int i=LocateElem(list,cur_e);
  if(i==0||i==1) return;
  *pre_e = *(list->elem-2);
}
void NextElem(PSqList list,ElemType cur_e,ElemType* next_e){
  int i=LocateElem(list,cur_e);
  if(i==0||i==list->length) return;
  *next_e = *(list->elem);
}
void DispList(PSqList list){
  int i;
  if(list->length==0) return;
  for(i=0; i<list->length-1; i++){
      print(*(list->elem+i));
      printf("->");
  }
  print(*(list->elem+i));
}
int GetElem(PSqList list,int i,ElemType* e){
  return *e = *(list->elem+i-1);
}
int  LocateElem(PSqList list,ElemType e){
  int i=0;
  while(i<list->length&&*(list->elem+i)!=e) i++;
  if(*(list->elem+i)==e) return i+1;
  else return 0;
}
void ListInsert(PSqList list,int i,ElemType e){
  int j,end=list->length;
  if(i*sizeof(ElemType)>list->listsize) return;
  
  if(end*sizeof(ElemType)>list->listsize){
     end --;
     list->length--;
  }
  for(j=end; j&&j+1>i; j--){
     *(list->elem+j)=*(list->elem+j-1);
  }
  *(list->elem+i-1) = e;
  list->length++;
}
void ListDelete(PSqList list,int i,ElemType* e){
  int j;
  for(j=i-1; j<list->length-1; j++){
     *(list->elem+j)=*(list->elem+j+1);
  }
  list->length--;
}
void ClearList(PSqList list){
  list->length = 0;
}
void print(ElemType e){
  switch(sizeof(e))
  {
     case 1: printf("%c",e); break;
     case 4: printf("%d",e); break;
     case 8: printf("%lf",e); break;
     default: printf("Can't print.");
  }
}
PSqList UnionList(PSqList lista,PSqList listb){
  int i=1,j=1,elems;
  PSqList listc;
  InitList(&listc);
  while(i<=ListLength(lista)||j<=ListLength(listb))
  {
      if(i>ListLength(lista)||GetElem(lista,i,&elems)>GetElem(listb,j,&elems)){
         ListInsert(listc,ListLength(listc)+1,GetElem(listb,j++,&elems));
      }
      else if(j>ListLength(listb)||GetElem(lista,i,&elems)<=GetElem(listb,j,&elems)){
         ListInsert(listc,ListLength(listc)+1,GetElem(lista,i++,&elems));
      }
  }
  return listc;
}
void SortList(PSqList list){
  int i,j;
  for(i=0; i<ListLength(list); i++)
     for(j=0; j<ListLength(list)-1;j++)
        if(*(list->elem+j)>*(list->elem+j+1)){
           *(list->elem+j)^=*(list->elem+j+1);
           *(list->elem+j+1)^=*(list->elem+j);
           *(list->elem+j)^=*(list->elem+j+1);
        }
}

源代码文件 "zhou-sqlist.c" 中的详细注释通常会解释各个部分的功能以及关键函数的工作原理。下面是对 "zhou-sqlist.c" 的一般理解,假设它是一个简单的单链表实现,用于存储整数并提供添加(insert)、删除(delete)、查找(search)等操作: ```c /* Zhou's Simple List (SQLIST.h) */ // 定义链表节点结构体 typedef struct Node { int value; // 节点值 struct Node* next; // 指向下一个节点的指针 } ListNode; // SQLIST.h头文件,包含链表的基本操作声明 #ifndef SQLIST_H #define SQLIST_H // 创建一个新链表的函数 ListNode* createList(); // 向链表中插入元素的函数 void insertNode(ListNode** head, int value); // 从链表中删除指定值的节点的函数 void deleteNode(ListNode** head, int value); // 查找链表中是否存在特定值的函数 int searchNode(ListNode* head, int value); #endif /* SQLIST_H */ // zhou-sqlist.c 实现部分 #include "SQLIST.h" // 创建链表的实现 ListNode* createList() { ListNode* head = NULL; // 初始化链表头部为空 return head; } // 插入节点的实现 void insertNode(ListNode** head, int value) { ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); // 分配内存给新节点 newNode->value = value; newNode->next = *head; // 新节点连接到当前头部 *head = newNode; // 更新链表头部 } // 删除节点的实现 void deleteNode(ListNode** head, int value) { if (*head == NULL) return; // 如果链表为空,直接返回 ListNode* curr = *head; while (curr != NULL && curr->value != value) { curr = curr->next; } if (curr == NULL) return; // 没找到对应节点,不做处理 ListNode* temp = curr->next; free(curr); // 释放已删除节点的内存 *head = temp; // 更新头部指向剩余节点 } // 查找节点的实现 int searchNode(ListNode* head, int value) { ListNode* curr = head; while (curr != NULL) { if (curr->value == value) return 1; // 找到就返回1 curr = curr->next; } return 0; // 没找到返回0 }
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值