#include <stdio.h>
#include <stdlib.h>
/*结构体的定义和数序表的定义*/
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
/*函数的声明*/
void InitNode(Node *h);
int AddNode(Node *h,ElemType e);
void DeleteNode(Node *s,int n);
void ChangeNode(Node *s,int n,ElemType e);
void InquireNode(Node *s,ElemType e);
void ShowNode(Node *s);
int main(void)
{
Node f;
InitNode(&f);
AddNode(&f,5);
AddNode(&f,8);
AddNode(&f,6);
AddNode(&f,123);
AddNode(&f,24);
AddNode(&f,66);
ShowNode(&f);
ChangeNode(&f,2,8888);
InquireNode(&f,8888);
return 0;
}
/*链表的初始化*/
void InitNode(Node *h)
{
h->data =0; //使用这个方式而不是使用书上的那种方式是因为书上的那种在新增节点的时候会出现问题
h->next = 0;
printf("Initialize data is right!\n");
}
/*增加一个链表节点*/
int AddNode(Node *h,ElemType e)
{
Node *f,*p;
f=h;
p = (Node *)malloc(sizeof(Node)); //申请一个新节点
p->next = 0; //新节点初始化
p->data = e;
while(f->next) //指针滑到最后一个节点
{
f = f->next;
}
f->next = p; //最后一个节点指向新申请的节点
printf("add data %d is right!\n",e);
return 1;
}
/*删除一个节点*/
void DeleteNode(Node *s,int n)
{
Node *f=s,*temp;
int i=0;
for(;i<n-1;i++)
{
f = f->next;
}
temp = ((f->next)->next);
free(f->next);
f->next = temp; //注意释放内存的时间应该在指针被覆盖前
printf("\nfinish delete %d Node\n",n);
}
/*更改一个节点的数据*/
void ChangeNode(Node *s,int n,ElemType e)
{
Node *f = s;
int i=0;
for(;i<n;i++)
f = f->next;
f->data =e;
printf("\nchange the data is right,the new Node is below:\n");
ShowNode(s);
}
/*查询一个数据*/
void InquireNode(Node *s,ElemType e)
{
Node *p=s;
int n=0,ss=0;
while(p->next)
{
if(p->data == e)
{
printf("\ndata is in node%d\n",n);
ss++;
}
p = p->next;
n++;
}
if(ss == 0)
printf("\nno data in Node!\n");
}
/*展示链表中的数据*/
void ShowNode(Node *s)
{
Node *p=s;
p = p->next; // 头节点不存数据
printf("\nThe data is shown below:\n");
while(p->next)
{
printf("%d\t",p->data);
p = p->next;
}
printf("%d",p->data);
}
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct node{
ElemType data;
struct node *next;
}linkNode;
int initLinkNode(linkNode *p);
int linkNodeAdd(linkNode *p,ElemType e);
int insertNode(linkNode *p,ElemType e,int n);
int LinkNodeDel(linkNode *p,int n);
int linkNodePop(linkNode *p);
int getLenght(linkNode *L);
int isInNode(linkNode *L,ElemType e);
int printNode(linkNode *p);
int main()
{
linkNode L;
initLinkNode(&L);
//增加节点的测试
linkNodeAdd(&L,11);
linkNodeAdd(&L,12);
linkNodeAdd(&L,13);
linkNodeAdd(&L,14);
printNode(&L);
//删除中间节点的测试
LinkNodeDel(&L,3);
printNode(&L);
//删除最后的节点的测试
linkNodePop(&L);
printNode(&L);
//插入节点测试
insertNode(&L,99,2);
printNode(&L);
//求长度测试
int sum = getLenght(&L);
printf("长度为:%d\n",sum);
//是否在链表中的测试
int is = isInNode(&L,13);
if(is == 1){
printf("is in node\n");
}
else
printf("not in node\n");
return 0;
}
int initLinkNode(linkNode *p){
p->data = 0;
p->next = NULL;
return 1;
}
/**
*尾部增加节点
*/
int linkNodeAdd(linkNode *p,ElemType e){
linkNode *L,*r = p;
//申请新的节点
L = (linkNode *)malloc(sizeof(linkNode));
L->data = e;
L->next = NULL;
//链表滑动到尾部
while(r->next){
r = r->next;
}
//尾部添加新节点
r->next = L;
printf("add %d is ok!\n",e);
return 1;
}
/**
*插入节点
*/
int insertNode(linkNode *p,ElemType e,int n){
linkNode *L = p,*temp,*new1;
int i=0;
for(;i<n-1;i++){
L = L->next;
}
temp = L->next;
//申请新节点
new1 = (linkNode *)malloc(sizeof(linkNode));
new1->data = e;
new1->next = temp;
L->next = new1;
printf("insert %d is ok!\n",e);
return 1;
}
/**
*尾部删除节点
*/
int linkNodePop(linkNode *p){
linkNode *L = p;
while((L->next)->next){
L = L->next;
}
L->next = NULL;
return 1;
}
/**
*定点删除节点
*/
int LinkNodeDel(linkNode *p,int n){
linkNode *f = p,*temp;
int i=0;
for(;i<n-1;i++){
f = f->next;
}
temp = f->next;
f->next = temp->next;
free(temp);
return 1;
}
/**
*遍历单链表
*/
int printNode(linkNode *p){
linkNode *L = p;
L = L->next;
printf("下面开始遍历整个单链表:\n");
while(L->next){
printf("%d-",L->data);
L = L->next;
}
printf("%d\n",L->data);
return 1;
}
/**
*求单链表长度
*/
int getLenght(linkNode *L){
linkNode *p = L;
int sum=0;
while(p->next){
sum++;
p = p->next;
}
return sum;
}
/**
*判断数据是否在链表中
*/
int isInNode(linkNode *p,ElemType e){
linkNode *L=p;
L = L->next;
while(L->next){
if(L->data == e){
return 1;
}
L = L->next;
}
if(L->data == e){
return 1;
}
return 0;
}