如果屏幕前的你对指针不是很熟悉的话,希望你在开始往下阅读前,能先看看前面我写的指针的小结(根据自己情况,指针先弄懂)。
一. 指针带头结点:
点头结点的单链表所具有的优点:
1.第一个结点的操作和表中其它节点的操作相一致,无需进行特殊处理;
2.无论链表是否为空,都有一个头节点,因此空表和非空表的处理也就统一了。
二. 单链表的特点:
当访问过一个节点后,只能接着访问它的后继节点,而无法访问它的前趋节点。
三.下面就直接上程序了:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct LNode{
int data;
struct LNode* next;
}LinkList;
void CreateListF(LinkList* &L,int n){
LinkList* s;
int i;
srand((unsigned)time(NULL));
L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL;
for(i=0;i<n;i++){
s=(LinkList*)malloc(sizeof(LinkList));
s->data=rand()%100;
s->next=L->next;
L->next=s;
}
} //头插法
void CreateListR(LinkList *&L,int n){
LinkList* r,*s;
int i;
srand((unsigned)time(NULL));
L=(LinkList*)malloc(sizeof(LinkList));
r=L;
for(i=0;i<n;i++){
s=(LinkList*)malloc(sizeof(LinkList));
s->data=rand()%100;
r->next=s;
r=s;
}
r->next=NULL;
} //尾插法
void DestroyList(LinkList* &L){
LinkList* pre=L,*p=L->next;
while(p!=NULL){
free(pre);
pre=p;
p=pre->next;
}
free(pre);
} //摧毁节点
int ListLength(LinkList* &L){
LinkList* p=L;
int n=0;
while(p!=NULL){
n++;
p=p->next;
}
return n;
} //整个链表的长度
void DispList(LinkList* &L){
LinkList* p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
} //输出链表
void ListInsert(LinkList* &L,int n){
LinkList* p=L,*s;
int i=0;
while(i<n&&p!=NULL){
p=p->next;
i++;
}
s=(LinkList*)malloc(sizeof(LinkList));
s->next=p->next;
p->next=s;
} //插入节点
int SeachList(LinkList* &L, int n){
LinkList* p=L->next;
int i=1; //算上头节点
while(p!=NULL&&p->data!=n){
p=p->next;
i++;
}
if(p==NULL){
printf("此链表不存在该值");
return 0;
}
return i;
} //查找元素(可根据自己情况调整关键字)
int main(void){
LinkList* L;
int n;
scanf_s("%d",&n);
if(n%2==1) CreateListF(L,n);
else CreateListR(L,n);
DispList(L);
return 0;
}
希望大家学的愉快。