1. 程式人生 > >連結串列的基本運算,插入,刪除和輸出

連結串列的基本運算,插入,刪除和輸出

【問題描述】

設計並實現線性表的單鏈表儲存和運算。

【基本要求】

實現單鏈表的插入、刪除和遍歷運算,每種操作用一個函式實現。 插入操作:將一個新元素插入表中指定序號的位置。 刪除操作:將指定序號的元素從表中刪除。 遍歷操作:從表頭按次序輸出所有元素的值,若是空表,則輸出資訊“empty list!”。

【實現提示】

  1. 程式執行時,首先在 main 函式中建立空的、帶頭結點的單鏈表。然後多次呼叫實現插入操作的函式(每次都將元素在序號 1 位置上插入),將元素依次插入表中,最後呼叫實現遍歷操作的函式輸出所有元素。之後再多次呼叫實現刪除操作的函式將表還原為空表(每次都刪除第 1 個元素,每刪除 一個元素後,將表中剩餘元素都輸出一次)。
  2. 單鏈表結點型別定義:
  3. typedef int ElemType;     //為簡化起見,元素型別定義為整型
  4. typedef struct Node{

ElemType data; struct Node *next;

}Node, *LinkList;

5.為了簡化指標引數傳遞,使用 c++的引用引數,儲存源程式時注意字尾名應為 cpp。 (其他實 驗題目在此處的處理相同)

6.建立連結串列時,可以多次呼叫插入函式(插入函式的功能是在連結串列的第 i 個元素結點前插入一個 新結點),通過不斷地在連結串列中增加結點來實現,也可以定義一個專門建立連結串列的函式,呼叫一次該函 數就完成連結串列中所有結點的建立(當然,此後需要在連結串列中插入一個新結點時呼叫前述的插入函式即 可)。

/****************
連結串列的基本運算***
插入刪除和輸出***
by涼柒_lq    ***
****************/
#include<stdio.h>
#include<stdlib.h>

typedef int Elemtype;
typedef struct LNode
{
	Elemtype data;
	struct LNode* next;
}LNode;
typedef LNode* Linklist;
typedef int Status;

#define overflow -2
#define true  1
#define false 0
#define ok 1
#define error 0

/*表頭插入法*/
Status Createlist(Linklist &L, int n)
{
	int i;
	Linklist p;
	Status ListTravel(Linklist &L);
	L = (Linklist)malloc(sizeof(LNode));
	if (!L)
		exit(overflow);
	L->next = NULL;

	for (i = n; i>0; i--)
	{
		p = (Linklist)malloc(sizeof(LNode));
		if (!p)
			exit(overflow);
		scanf("%d", &p->data);
		p->next = L->next;
		L->next = p;
	}
	    printf("\n");
	    ListTravel(L);
	  return ok;
}

/*空表判斷函式*/
/*連結串列存在且只有頭結點*/
Status ListEmpty(Linklist &L)
{
	if (L != NULL && L->next == NULL)
	{
		printf("empty list!\n");
		return true;
	}
	else
		return false;
}

/*頭結點刪除函式*/
Status Topdellist(Linklist &L)
{
	Status Listlength(Linklist &L);
	Status ListTravel(Linklist &L);
	int j; Linklist p;
	int b = Listlength(L);
        for (j = 0; j<b; j++)
	{
		p = L;
		p = p->next;
		L->next = p->next;
		free(p);
		ListTravel(L);
	}
	if(ListEmpty(L))
	   return ok;
}


/*連結串列長度函式*/
Status Listlength(Linklist &L)
{
	Linklist p;
	int i;
	if (L)
	{
		i = 0;
		p = L->next;
		while (p)
		{
			i++;
			p = p->next;
		}
	}
	return i;
}


/*遍歷並輸出,呼叫visit函式*/
Status ListTravel(Linklist &L)
{
	void Visit(Linklist &p);
	Linklist p;
	if (!L)
		return 0;
	else
		p = L->next;
	while (p)
	{
		Visit(p);
		p = p->next;
	}
	if(L->next!=NULL)
	  printf("\n\n");
	return ok;
}

/*visit函式*/ 
void Visit(Linklist &p)
{
     printf("%d ",p->data);
}


/*主函式*/
int main()
{
	Linklist L;
	Createlist(L, 5);
	Topdellist(L);
	return 0;
}

執行結果截圖: 

 

程式碼不難,細看就可以看懂,明天會更新第二種方法。

原創,轉載註明出處。