資料結構練習題(順序表和單連結串列)C++

不吹牛會死麼發表於2020-12-06

1、
程式設計實現順序表的各種基本運算,並在此基礎上設計一個主程式,完成如下功能:
(1)初始化順序表;
(2)給定一個整型資料元素,將此元素插入到順序表的第i個位置;
(3)刪除順序表中第i個位置的元素,利用e返回被刪除的元素。

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

#define OK   1
#define ERROR   0
#define OVERFLOW   -2
typedef  int  ElemType;
typedef  int  Status;

//----- 順序表的順序儲存表示 -----
#define LIST_INIT_SIZE 100 // 儲存空間的初始分配量
#define LISTINCREMENT 10 // 儲存空間的分配增量
typedef struct {
	ElemType	*elem;	// 儲存空間的基址
            int length; // 表長
            int size;// 儲存容量
	int increment; // 擴容時,增加的儲存容量
} SqList;  //順序表 

// 構造一個順序表 
Status InitSqlist(SqList &L){
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if(!L.elem) exit (OVERFLOW);
	L.length = 0;
	L.size = LIST_INIT_SIZE;
	L.increment = LISTINCREMENT;
	return OK;
}
// 判順序表是否為空表 
Status ListEmpty(SqList L){
	if (L.length==0) return OK;
	else return ERROR;
}
//順序表插入函式
Status ListInsert_Sq(SqList &L, int i ,ElemType e){ 
//請在此填寫程式碼,將該演算法補充完整,參見課本和課件相關章節  
int j;
   if (i<1 || i>L.length+1)
      return false;		
   i--;				
   for (j=L.length;j>i;j--)	
	L.elem[j]=L.elem[j-1];
   L.elem[i]=e;		
   L.length++;			
   return true;			

}


//順序表刪除元素函式
Status ListDelete_Sq(SqList &L, int i, ElemType  &e){
//請在此填寫程式碼,將該演算法補充完整,參見課本和課件相關章節
	int j;
   if(i<1||i>L.length)
   return false;
   i--;				
   e=L.elem[i];
   for (j=i;j<L.length-1;j++)  	
	L.elem[j]=L.elem[j+1];
   L.length--;			
   return true;
}

//輸出順序表函式
void OutList_Sq(SqList L)
{	int i;
    ElemType  e;
	if(ListEmpty(L)){
		printf("這是一個空表!");
	}
	else
	{ 
	 printf("順序表為:");
	 for(i=0;i<L.length;i++)
	    printf("%6d",L.elem[i]);
	}
	printf("\n");
}
//主函式
int main()
{ SqList L;
	int cord,i; ElemType a;
	printf(" 姓名:蔡旭勝 \n 學號:2050414821 \n 班級:軟體設計11班"); 
	printf("第一次使用必須初始化!\n");
	do{
		printf("\n 主選單 \n");
		printf(" 1 初始化順序表 ");
		printf(" 2 插入一個元素 ");
		printf(" 3 刪除一個元素 ");
		printf(" 4 結束程式執行 ");
		printf("\n-------------------------------------------------------------------\n");
		printf("請輸入您的選擇( 1, 2, 3, 4)");
		scanf("%d",&cord);
		printf("\n");
		switch(cord){
		case 1:
			InitSqlist(L);
			OutList_Sq(L);
			break;
		case 2:
			printf("\n請輸入要插入的插入位置和資料元素(如:3 20)");
			scanf("%d%d",&i,&a);
			ListInsert_Sq(L,i,a);
			printf("\n插入%d元素之後的",a);
			OutList_Sq(L);
			break;
		case 3:
			printf("\n請輸入要刪除的資料元素的位置(如: 3)");
			scanf("%d",&i);
			ListDelete_Sq(L,i,a);
			printf("\n刪除第%d個位置的元素之後",i);
			OutList_Sq(L);
			break;
		case 4:
			exit(0);
}
}while (cord<=4);
return 1;
} 

2、
程式設計實現建立一個單連結串列,並在此表中插入一個元素和刪除一個元素
(1)通過鍵盤讀取元素建立單連結串列;
(2)指定一個位置,在此位置之前插入一個新元素;
(3)指定一個位置,刪除此位置元素。

#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0

typedef int ElemType;
typedef int Status;
typedef struct Lnode {
   ElemType data;
   struct Lnode *next;
}Lnode,*LinkList;

//以下是建立單連結串列
void CreatList_L(LinkList &head)
{	LinkList tail, p;
	int n,i;
	p=(Lnode *)malloc(sizeof(Lnode));
	head=tail=p;
	head->next=NULL;
	printf("\n請輸入連結串列的長度:");
	scanf("%d", &n);
	printf("\n請輸入%d個整型資料元素",n);
	for(i=1;i<=n;i++){
		p= (Lnode *)malloc(sizeof(Lnode));
		scanf("%d", &p->data);
		p->next=NULL;
		tail->next=p;
		tail=p;
	}
	printf("\n單連結串列的建立成功!");
}
 
//以下是輸出單連結串列
void OutputList_L(LinkList L){
	LinkList p = L->next;
	if(p==NULL){
	printf("是一個空表!\n");
	return;
	}
	printf("單連結串列是:");
	while (p ) {
	printf("%4d",p->data);
	p = p->next;
	}
	printf("\n");
}


      //在第 i 個元素之前插入一個元素
Status ListInsert_L(LinkList L, int i, ElemType e) {
	LinkList p,s;
	p=L;
	int j=0;
	for(j=0;j<i;j++)
	{
		p=p->next;
	} 
	s= (Lnode *)malloc(sizeof(Lnode));
	s->data=e;
	 s->next=p->next;
	 p->next=s; 
	//請在此填寫程式碼,將該演算法補充完整,參見課本和課件相關章節  
	return OK;
}

// 刪除第 i 個元素
Status ListDelete_L(LinkList L, int i, ElemType &e) {
	LinkList p,q;
	p=L;
	q=L;
	int j=0;
	for(j=0;j<i-1;j++) 
	{
		p=p->next;
		q=q->next;
	} 
	q= q->next;
	e=q->data;
	p->next=p->next->next; 
 //請在此填寫程式碼,將該演算法補充完整,參見課本和課件相關章節  
	return OK;
}


int main()
{ LinkList L;
   int cord,i; ElemType a;
   printf(" 姓名:蔡旭勝 \n 學號:2050414821 \n 班級:軟體設計11班"); 
	printf("\n 您是第一次使用請先建立一個單連結串列!\n");
	do{
		printf("\n 主選單 \n");
		printf(" 1 建立一個單連結串列 ");
		printf(" 2 插入一個元素 ");
		printf(" 3 刪除一個元素 ");
		printf(" 4 結束程式執行 ");
		printf("\n-------------------------------------------------------------------\n");
		printf("請輸入您的選擇( 1, 2, 3, 4)");
		scanf("%d",&cord);
		printf("\n");
		switch(cord){
		case 1:
			CreatList_L(L);
	        OutputList_L(L);
			break;
		case 2:
			printf("\n請輸入要插入的插入位置和資料元素(如:3 20)");
			scanf("%d%d",&i,&a);
			
			if(ListInsert_L(L,i,a))
			{
               printf("\n插入元素成功!插入%d元素之後的",a);
               OutputList_L(L);
			   }
            else printf("插入元素失敗!\n");
			break;
		case 3:
			printf("\n請輸入要刪除的資料元素的位置(如: 3)");
			scanf("%d",&i);
			if(ListDelete_L(L,i,a))
			{
			printf("\n刪除元素成功!被刪除的元素是 %d\n",a);
			printf("\n刪除第%d個位置的元素之後",i);
			OutputList_L(L);
			}
			else printf("刪除位置錯誤,請重新執行!\n");
			break;
		case 4:
			exit(0);
}
}while (cord<=4);
return 1;
}

來自課下作業

相關文章