/*國嵌版的,採用代碼複用的思想*/
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
typedef void LinkList;
typedef struct _tag_LinkListNode LinkListNode;
struct _tag_LinkListNode
{
LinkListNode* next; /*Linuxn內核中主要就是此類做法*/
};
LinkList* LinkList_Create();
void LinkList_Destroy(LinkList* list);
void LinkList_Clear(LinkList* list);
int LinkList_Empty(LinkList* list);
int LinkList_Length(LinkList* list);
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
LinkListNode* LinkList_Get(LinkList* list, int pos);
LinkListNode* LinkList_Delete(LinkList* list, int pos);
#endif
#include <stdio.h>
#include <malloc.h>
#include "LinkList.h"
typedef struct _tag_LinkList
{
LinkListNode header;
int length;
} TLinkList;
LinkList* LinkList_Create()
{
TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));
if(ret != NULL)
{
ret->header.next = NULL;
ret->length = 0;
}
return ret;
}
void LinkList_Destroy(LinkList* list)
{
free(list);
}
void LinkList_Clear(LinkList* list)
{
TLinkList* slist = (TLinkList*)list;
if(slist != NULL)
{
slist->header.next = NULL;
slist->length = 0;
}
}
int LinkList_Empty(LinkList* list)
{
TLinkList* slist = (TLinkList*)list;
int ret = 0;
if((slist != NULL) && (slist->length == 0))
{
ret = 1;
}
return ret;
}
int LinkList_Length(LinkList* list)
{
TLinkList* slist = (TLinkList*)list;
int ret = -1;
if(slist != NULL)
{
ret = slist->length;
}
return ret;
}
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
TLinkList* slist = (TLinkList*)list;
int i = 0;
int ret = (slist != NULL) && (0 <= pos);
if(ret)
{
LinkListNode* current = (LinkListNode*)slist;
for(i=0;(i < pos) && (current->next != NULL);i++)
{
current = current->next;
}
node->next = current->next;
current->next = node;
slist->length++;
}
return ret;
}
LinkListNode* LinkList_Get(LinkList* list, int pos)
{
TLinkList* slist = (TLinkList*)list;
LinkListNode* ret = NULL;
int i = 0;
if((0 <= pos) && (pos < slist->length))
{
LinkListNode* current = (LinkListNode*)slist;
for(i=0;i<pos;i++)
{
current = current->next;
}
ret = current->next;
}
return ret;
}
LinkListNode* LinkList_Delete(LinkList* list, int pos)
{
TLinkList* slist = (TLinkList*)list;
LinkListNode* ret = NULL;
int i = 0;
if((slist != NULL) && (0 <= pos) && (pos < slist->length))
{
LinkListNode* current = (LinkListNode*)slist;
for(i=0;i<pos;i++)
{
current = current->next;
}
ret = current->next;
current->next = ret->next;
slist->length--;
}
return ret;
}
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct value
{
LinkListNode header; /*一定要包含結點結構體,這種是Linux內核鏈表主要採用的思想*/
char c;
} DataElem;
int main(int argc, char *argv[])
{
LinkList* list = LinkList_Create();
DataElem v1,v2,v3,v4,v5,v6;
v1.c = 'a';
v2.c = 'b';
v3.c = 'c';
v4.c = 'd';
v5.c = 'e';
v6.c = 'f';
int i = 0;
LinkList_Insert(list,(LinkListNode*)&v1,0);
LinkList_Insert(list,(LinkListNode*)&v2,0);
LinkList_Insert(list,(LinkListNode*)&v3,0);
LinkList_Insert(list,(LinkListNode*)&v4,0);
LinkList_Insert(list,(LinkListNode*)&v5,0);
LinkList_Insert(list,(LinkListNode*)&v6,0);
for(i=0;i<LinkList_Length(list);i++)
{
DataElem* p = (DataElem*)LinkList_Get(list,i);
printf("the element is %c\n",(*p).c);
}
printf("the length is %d\n",LinkList_Length(list));
printf("\n");
while(LinkList_Length(list) > 0)
{
DataElem* p = (DataElem*)LinkList_Delete(list,LinkList_Length(list)-1);
printf("the element is %c\n",(*p).c);
}
LinkList_Clear(list);
printf("LinkList is Empty(%d)\n",LinkList_Empty(list));
LinkList_Destroy(list);
return 0;
}
/*大話數據結構版修改*/
#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
#include "io.h"
#include "math.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=(Node*)malloc(sizeof(Node)); /* 產生頭結點,並使L指向此頭結點 */
if((*L) == NULL) /* 存儲分配失敗 */
return ERROR;
(*L)->next=NULL; /* 指針域爲空 */
return OK;
}
/* 初始條件:順序線性表L已存在。操作結果:若L爲空表,則返回TRUE,否則返回FALSE */
Status ListEmpty(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;
}
(*L)->next=NULL; /* 頭結點指針域爲空 */
return OK;
}
/* 初始條件:順序線性表L已存在。操作結果:返回L中數據元素個數 */
int ListLength(LinkList L)
{
int i=0;
Node* p=L->next; /* p指向第一個結點 */
while(p)
{
i++;
p=p->next;
}
return i;
}
/* 初始條件:順序線性表L已存在,0≤i<ListLength(L) */
/* 操作結果:用e返回L中第i個數據元素的值 */
Status GetElem(LinkList L,int pos,ElemType *e)
{
int i;
if(0 <= pos && pos<ListLength(L))
{
Node *current = L->next;
for(i=0; i< pos && current->next != NULL ;i++)
{
current = current->next;
}
*e = current->data;
return OK;
}
return ERROR;
}
/* 初始條件:順序線性表L已存在 */
/* 操作結果:返回L中第1個與e滿足關係的數據元素的位序。 */
/* 若這樣的數據元素不存在,則返回值爲-1*/
int LocateElem(LinkList L,ElemType e)
{
int i=0;
Node *current = L->next;
while(current)
{
if(current->data==e) /* 找到這樣的數據元素 */
return i;
current=current->next;
i++;
}
return -1;
}
/* 初始條件:順序線性表L已存在,0≤i<ListLength(L), */
/* 操作結果:在L中第i個位置之前插入新的數據元素e,L的長度加1 */
Status ListInsert(LinkList *L,int pos,ElemType e)
{
int i;
if(0 <= pos && L!=NULL)
{
Node *current = *L; /*current是頭結點,指向第0個節點*/
if(pos>=ListLength(*L))
{
pos = ListLength(*L);
}
for(i=0; i< pos && current->next != NULL ;i++)
{
current = current->next;
}
Node *Next = current->next;
Node *s = (Node*)malloc(sizeof(Node));
s->data = e;
s->next = Next;
current->next = s;
return OK;
}
return ERROR;
}
/* 初始條件:順序線性表L已存在,0≤i<ListLength(L) */
/* 操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1 */
Status ListDelete(LinkList *L,int pos,ElemType *e)
{
int i;
if(0 <= pos && pos < ListLength(*L)&& L!=NULL && e != NULL)
{
Node *current = *L; /*current是頭結點,指向第0個節點*/
for(i=0; i< pos && current->next != NULL ;i++)
{
current = current->next;
}
Node *Next = current->next;
*e = Next->data;
current->next = Next->next;
free(Next);
return OK;
}
return ERROR;
}
/* 初始條件:順序線性表L已存在 */
/* 操作結果:依次對L的每個數據元素輸出 */
Status ListTraverse(LinkList L)
{
LinkList p=L->next;
while(p)
{
visit(p->data);
p=p->next;
}
printf("\n");
return OK;
}
#if 1
/* 隨機產生n個元素的值,建立帶表頭結點的單鏈線性表L(頭插法) */
void CreateListHead(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; /* 表示當前鏈表結束 */
}
#endif
int main()
{
LinkList L;
ElemType e;
Status i;
int j,k;
i=InitList(&L);
printf("初始化L後:ListLength(L)=%d\n",ListLength(L));
for(j=1;j<=5;j++)
i=ListInsert(&L,0,j);
printf("在L的表頭依次插入1~5後:L.data=");
ListTraverse(L);
printf("ListLength(L)=%d \n",ListLength(L));
i=ListEmpty(L);
printf("L是否空:i=%d(1:是 0:否)\n",i);
i=ClearList(&L);
printf("清空L後:ListLength(L)=%d\n",ListLength(L));
i=ListEmpty(L);
printf("L是否空:i=%d(1:是 0:否)\n",i);
for(j=1;j<=10;j++)
ListInsert(&L,j-1,j);
printf("在L的表尾依次插入1~10後:L.data=");
ListTraverse(L);
printf("ListLength(L)=%d \n",ListLength(L));
ListInsert(&L,0,0);
printf("在L的表頭插入0後:L.data=");
ListTraverse(L);
printf("ListLength(L)=%d \n",ListLength(L));
GetElem(L,5,&e);
printf("第5個元素的值爲:%d\n",e);
for(j=3;j<=4;j++)
{
k=LocateElem(L,j);
if(k)
printf("第%d個元素的值爲%d\n",k,j);
else
printf("沒有值爲%d的元素\n",j);
}
k=ListLength(L); /* k爲表長 */
for(j=k+1;j>=k;j--)
{
i=ListDelete(&L,j,&e); /* 刪除第j個數據 */
if(i==ERROR)
printf("刪除第%d個數據失敗\n",j);
else
printf("刪除第%d個的元素值爲:%d\n",j,e);
}
printf("依次輸出L的元素:");
ListTraverse(L);
j=5;
ListDelete(&L,j,&e); /* 刪除第5個數據 */
printf("刪除第%d個的元素值爲:%d\n",j,e);
printf("依次輸出L的元素:");
ListTraverse(L);
i=ClearList(&L);
printf("\n清空L後:ListLength(L)=%d\n",ListLength(L));
CreateListHead(&L,20);
printf("整體創建L的元素(頭插法):");
ListTraverse(L);
i=ClearList(&L);
printf("\n刪除L後:ListLength(L)=%d\n",ListLength(L));
CreateListTail(&L,20);
printf("整體創建L的元素(尾插法):");
ListTraverse(L);
return 0;
}