#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define OK (1)
#define ERROR (0)
#define TRUE (1)
#define FALSE (0)
#define MAXSIZE 20 /* 存儲空間初始分配量 */
typedef int Status;/* Status是函數的類型,其值是函數結果狀態代碼,如OK等 */
typedef int ElemType;/* ElemType類型根據實際情況而定,這裏假設爲int */
Status visit(ElemType c)
{
printf("%d ",c);
return OK;
}
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList; /* 定義LinkList */
/* 初始化順序線性表 */
Status InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node)); /* 產生頭結點,並使L指向此頭結點 */
if(!(*L)) /* 存儲分配失敗 */
{
return ERROR;
}
(*L)->next=NULL; /* 指針域爲空 */
return OK;
}
/* 初始條件:順序線性表L已存在。操作結果:若L爲空表,則返回TRUE,否則返回FALSE */
Status IsEmptyList(LinkList L)
{
if(L->next)
{
return FALSE;
}
else
{
return TRUE;
}
}
/* 初始條件:順序線性表L已存在。操作結果:將L重置爲空表 */
Status ClearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next; /* p指向第一個結點 */
while(p) /* 沒到表尾 */
{
q = p->next;
free(p);
p = q; /* update operated node */
}
(*L)->next = NULL; /* 頭結點指針域爲空 */
return OK;
}
/* 初始條件:順序線性表L已存在。操作結果:返回L中數據元素個數 */
int GetListLength(LinkList L)
{
int i = 0;
LinkList p = L->next; /* p指向第一個結點 */
while(p)
{
i++;
p = p->next;
}
return i;
}
/* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */
/* 操作結果:用e返回L中第i個數據元素的值 */
Status GetElem(LinkList L,int i,ElemType *pElem)
{
int j = 1; /* j爲計數器 */
LinkList p; /* 聲明一結點p */
p = L->next; /* 讓p指向鏈表L的第一個結點 */
while ((p != NULL) && (j < i)) /* p不爲空或者計數器j還沒有等於i時,循環繼續 */
{
p = p->next; /* 讓p指向下一個結點 */
++j;
}
if ((!p) || (j > i))
{
return ERROR; /* 第i個元素不存在 */
}
*pElem = p->data; /* 取第i個元素的數據 */
return OK;
}
/* 初始條件:順序線性表L已存在 */
/* 操作結果:返回L中第1個與e滿足關係的數據元素的位序。 */
/* 若這樣的數據元素不存在,則返回值爲0 */
int GetLocationForElem(LinkList L, ElemType e)
{
int i = 0;
LinkList p = L->next;
while(p)
{
i++;
if(p->data == e) /* 找到這樣的數據元素 */
return i;
p = p->next;
}
return 0;
}
/* 初始條件:順序線性表L已存在,1≤i≤ListLength(L), */
/* 操作結果:在L中第i個位置之前插入新的數據元素e,L的長度加1 */
Status InsertListNode(LinkList *L, int i, ElemType e)
{
int j;
LinkList p,s;
p = *L;
j = 1;
while ((p != NULL) && (j < i)) /* 尋找第i個結點 */
{
p = p->next;
++j;
}
if (!p || (j > i))
{
return ERROR; /* 第i個元素不存在 */
}
s = (LinkList)malloc(sizeof(Node)); /* 生成新結點(C語言標準函數) */
s->data = e;
s->next = p->next; /* 將p的後繼結點賦值給s的後繼 */
p->next = s; /* 將s賦值給p的後繼 */
return OK;
}
/* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */
/* 操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1 */
Status DeleteListNode(LinkList *L, int i, ElemType *e)
{
int j = 1;
LinkList p,q;
p = *L;
while ((p->next !=NULL) && (j < i)) /* 遍歷尋找第i個元素 */
{
p = p->next;
++j;
}
if (!(p->next) || j > i)
{
return ERROR; /* 第i個元素不存在 */
}
q = p->next;
p->next = q->next; /* 將q的後繼賦值給p的後繼 */
*e = q->data; /* 將q結點中的數據給e */
free(q); /* 讓系統回收此結點,釋放內存 */
return OK;
}
/* 初始條件:順序線性表L已存在 */
/* 操作結果:依次對L的每個數據元素輸出 */
Status ListTraverse(LinkList L)
{
LinkList p=L->next;
while(p)
{
visit(p->data);
p=p->next;
}
printf("\n");
return OK;
}
/* 隨機產生n個元素的值,建立帶表頭結點的單鏈線性表L(頭插法) */
void CreateListWithHead(LinkList *L, int n)
{
LinkList p;
int i;
srand(time(0)); /* 初始化隨機數種子 */
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL; /* 先建立一個帶頭結點的單鏈表 */
for (i=0; i<n; i++)
{
p = (LinkList)malloc(sizeof(Node)); /* 生成新結點 */
p->data = (rand() % 100) + 1; /* 隨機生成100以內的數字 */
p->next = (*L)->next;
(*L)->next = p; /* 插入到表頭 */
}
}
/* 隨機產生n個元素的值,建立帶表頭結點的單鏈線性表L(尾插法) */
void CreateListTail(LinkList *L, int n)
{
LinkList p,r;
int i;
srand(time(0)); /* 初始化隨機數種子 */
*L = (LinkList)malloc(sizeof(Node)); /* L爲整個線性表 */
r= *L; /* r爲指向尾部的結點 */
for (i=0; i<n; i++)
{
p = (Node *)malloc(sizeof(Node)); /* 生成新結點 */
p->data = (rand() % 100) + 1; /* 隨機生成100以內的數字 */
r->next = p; /* 將表尾終端結點的指針指向新結點 */
r = p; /* 將當前的新結點定義爲表尾終端結點 */
}
r->next = NULL; /* 表示當前鏈表結束 */
}
鏈表的操作(純C語言版)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.