本文章主要對單鏈表的實現進行總結,以備複習:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct LNode{
int data;
struct LNode * next;
}LNode;
typedef LNode* List;
//頭插法帶頭結點創建
LNode * Createhead1(int length)
{
int data[12] ={0,1,2,3,4,5,6,7,8,9,10,11};
LNode * p;
//srand(time(0));
if(length < 1)
return NULL;
LNode *head = (LNode*)malloc(sizeof(LNode));
head->next = NULL;
int i = 1;
while(i<=length)
{
p = (LNode*)malloc(sizeof(LNode));
//p->data = rand()%100+1;
p->data = data[i];
p->next = head->next;
head->next = p;
i++;
}
return head;
}
//頭插法無頭結點創建
LNode *Createhead2(int length)
{
int data[12] ={0,1,2,3,4,5,6,7,8,9,10,11};
LNode*p;
//srand(time(0));
if(length<1)
return NULL;
LNode *first = (LNode*)malloc(sizeof(LNode));
first->next = NULL;
first->data = data[1];
int i = 2;
while(i<=length)
{
p = (LNode*)malloc(sizeof(LNode));
//p->data = rand()%100+1;
p->data = data[i];
p->next = first;
first = p;
i++;
}
return first;
}
//尾插法帶頭結點創建
LNode*Createrail1(int length)
{
int data[12] ={0,1,2,3,4,5,6,7,8,9,10,11};
LNode *p;
//srand(time(0));
if(length<1)
return NULL;
LNode *head =(LNode*)malloc(sizeof(LNode));
head->next = NULL;
LNode *temp = head;
int i = 1;
while(i<=length)
{
p = (LNode*)malloc(sizeof(LNode));
//p->data = rand()%100+1;
p->data = data[i];
temp->next = p;
temp = p;
i++;
}
temp->next = NULL;
return head;
}
//尾插法無頭結點創建
LNode * Createrail2(int length)
{
int data[12] ={0,1,2,3,4,5,6,7,8,9,10,11};
LNode *p;
//srand(time(0));
if(length<1)
return NULL;
LNode *first = (LNode*)malloc(sizeof(LNode));
first->next = NULL;
first->data = data[1];
LNode * temp = first;
int i =2;
while(i<=length)
{
p = (LNode*)malloc(sizeof(LNode));
//p->data = rand()%100+1;
p->data = data[i];
temp->next =p;
temp = p;
i++;
}
temp->next = NULL;
return first;
}
int Length(List L)
{
List p = L->next;
int len = 0;
while(p)
{
p = p->next;
len++;
}
return len;
}
List FindKth(int k,List L)
{
List p = L->next;
int i = 1;
while(p && i<k)
{
p = p->next;
i++;
}
if(i == k)
{
return p;
}
else
return NULL;
}
List Find(int value,List L)
{
List p = L->next;
while(p &&p->data!=value)
{
p = p->next;
}
return p;
}
List Insert(int value,int index,List L)
{
int j;
List p,s;
if(index == 1)
{
s = (List)malloc(sizeof(LNode));
s -> data = value;
s->next = L->next;
L -> next = s;
return L;
}
p = L;
j = 1;
while(p->next&&j<index)
{
p = p->next;
j++;
}
if(!p||j>index)
return NULL;
s = (List)malloc(sizeof(LNode));
s->data = value;
s->next = p->next;
p->next = s;
return L;
}
List Delete(int x,List L)
{
int j;
List p,s;
if(x ==1)
{
p = L->next;
if(p) {
L->next = p->next;
}
else
return NULL;
free(p);
return L;
}
p = L;
j = 1;
while(p->next && j<x)
{
p = p->next;
j++;
}
if(!p||j>x)
return NULL;
s = p->next;
p->next = s->next;
free(s);
return L;
}
void PrintL(List L)
{
List p = L->next; //注意,如果打印原始的列表,需要這個語句
//List p = L; //注意,如果打印從某一位置的鏈表,用這個
if(!p)
{
return;
}
while(p)
{
printf("%d ",p->data);
p = p->next;
}
}
int main01()
{
List L,p,q;
L = Createhead1(10);
L = FindKth(3,L);
L = Createrail1(10);
PrintL(L);
printf("\n");
L = Find(8,L);
//PrintL(L);
return 0;
}