數據結構學習筆記——線性表

一、特點


1、表頭、表尾,其他元素有且僅有一個直接前驅和直接後繼


2、任何位置可以插入、刪除


二、存儲方式


1、順序表


2、鏈表(單向鏈表、雙向循環鏈表)


三、具體實現方式


1、順序表


問題:

    用順序表存儲一些正整數,輸入正整數表示插入數據(比如輸入3表示插入3),輸入負整數表示刪除數據(比如輸入-2表示刪除2),輸入字符表示退出程序。插入和刪除的過程中保持該表遞增有序。


//seqlist.h

#ifndef __SEQLIST_H__
#define __SEQLIST_H__

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

#define SIZE 10   /*數組的長度*/

typedef int datatype;  /*定義結構體*/
typedef struct seqlist
{
	datatype data[SIZE]; //數組
	int last;   //定位元素
}seq_list, *seq_plist;

#endif


//test.c

#include "seqlist.h"

int main(void)
{
	int a;    //輸入的數
	int ret;
	seq_plist s;
	s = seqlist_init();  //初始化順序表
	while(1){
		printf("請輸入一個數:\n");
		ret = scanf("%d", &a);
		if(ret != 1)
			exit(1);
		else if(data >= 0)
			seqlist_insert(s, a);
		else
			seqlist_del(s,-a);
	}
	return 0;
}

//seqlist.c

#include "seqlist.h"

seq_plist seqlist_init(void)    //初始化函數
{
	seq_plist s;

	s = (seq_plist)malloc(sizeof(seq_list));
	if(NULL == s){
		printf("malloc failed!\n");
		exit(1);
	}
	s->last = -1;

	return s;
}

void seqlist_insert(seq_plist s, typedata a)  //插入函數
{
	if(seqlist_full(s))
		return;
	int i,j;

	for(i = 0 ; i <= s->last; i++)
		if(a < s->data[i])
			break;
	for(j = s->last; j >= i; j--)
		s->data[j+1] = s->data[j];
	s->data[i] = data;
	s->last++;
	seqlist_show(s);
}

void seqlist_del(seq_plist s, typedata a)   //刪除函數
{
	if(seqlist_empty(s))
		return;
	int i,j;

	for(i = 0; i <= s->last; i++)
		if(a = s->data[i])
			break;
	for(j = i; j < s->last; j++)
		s->data[j] = s->data[j+1];
	s->last--;
	seqlist_show(s);
}

bool seqlist_full(seq_plist s)  //判斷順序表是否已滿
{
	if(s->last == size-1)
		return true;
	else 
		return false;
}

bool seqlist_empty(seq_plist s) //判斷順序表是否已空
{
	if(s->last == -1)
		return true;
	else 
		return false;
}

void seqlist_show(seq_plist s) //打印順序表
{
	int i;
	
	for(i = 0; i <= s->last; i++)
		printf("%d\t", s->data[i]);
	printf("\n");
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章