单链表的操作
没事多敲敲代码,哈哈
#include "stdio.h" #include "stdlib.h" #include "time.h" typedef struct Node { int data; struct Node *next; }Node,* Linklist; //构造头结点,让L指向头结点 int Initlist(Linklist &L) { L = (Linklist)malloc(sizeof(Node)); //产生头结点,让L指向头结点 if(!L){ //内存分配错误 return 0; } L->next = NULL; //指针域为空 return 1; } //计算Link的长度 int ListLength(Linklist L) { Linklist p; int i=0; p = L->next; while(p){ p = p->next; i++; } return i; } int ListTraverse(Linklist L) { Linklist p; p = L->next; while(p){ printf("%d ",p->data); p = p->next; } printf("\n"); return 1; } //在第i个节点(不包括头结点)之前插入新的节点 int ListInsert(Linklist &L,int i,int e) { int j; Linklist p,s; p = L; j = 1; while (p && j < i) /* 寻找第i个结点 */ { p = p->next; ++j; } if (!p) return 0; /* 第i个元素(包括头结点)不存在 */ s = (Linklist)malloc(sizeof(Node)); /* 生成新结点(C语言标准函数) */ s->data = e; s->next = p->next; /* 将p的后继结点赋值给s的后继 */ p->next = s; /* 将s赋值给p的后继 */ return 1; } //头插法 (在链表的第一个节点之前插入新节点) int CreatHead(Linklist &L) { Linklist p; int i; srand(time(0)); //初始化随机数种子 for( i=1;i<10;i++){ p = (Linklist)malloc(sizeof(Node)); //生成新节点 p->data = rand()%100+1; p->next = L->next; L->next = p; } return 1; } //尾插法 int CreatTail(Linklist &L) { Linklist p,r; int i; r = L; for(i=1;i<10;i++){ p = (Linklist)malloc(sizeof(Node)); //生成新节点 p->data = i; r->next = p; r = p; } r->next = NULL; return 1; } //删除指定的节点 int DeleteNode(Linklist &L,int e) { Linklist p,q; q = L; p = L->next; //指向第一个节点 while(p && (p->data != e)){ // 查找给定的数字 q = p; p = p->next; } if(!p){ //给定的数字不存在 return 0; } q->next = p->next; free(p); return 1; } int main() { Linklist L; int i,j,num; i = Initlist(L); // printf("%d",i); printf("Linklist的长度为:%d\n",ListLength(L)); // CreatHead(L); //头插法 CreatTail(L); //尾插法 printf("Linklist的长度为:%d\n",ListLength(L)); ListTraverse(L); printf("请输入你要删除的元素:\n"); scanf("%d",&num); i = DeleteNode(L,num); if(!i){ printf("该元素不存在!\n"); } ListTraverse(L); return 0; }