顺序表相比,链表增强了数据间的连接,一个接一个,发现July的博客比较深层次,还是打好基础再了解更深一层的东西。
还是分LinkList.h,LinkList.c,main.c
之前匆匆忙忙赶东西时,就copy一大段改改就交了。自己重写后发现诸多问题在这一块里。
LinkList.h
#include<stdio.h>
#include<malloc.h>
typedef int DataType;
typedef struct SimpleLinkList *Node;
struct SimpleLinkList{
DataType info;
Node link;
} ;
typedef struct SimpleLinkList *LinkList;
LinkList CreateNUllList();
int isNull(LinkList linklist);
int insertPost(LinkList linklist,Node node,DataType element);
int insertBack(LinkList linklist,Node node,DataType element);
int printList(LinkList linklist);
Node searchElement(LinkList linklist,DataType element);
DataType showValue(LinkList linklist,Node node);
int deleteElement(LinkList linklist,DataType element);
LinkList combine(LinkList one,LinkList another);
LinkList.c
#include "LinkList.h"
LinkList CreateNUllList(){
LinkList linklist = (LinkList)malloc(sizeof(struct SimpleLinkList));
if(linklist != NULL)
linklist -> link = NULL;
else
printf("create fail!");
return linklist;
}
int isNull(LinkList linklist){
return (linklist != NULL); // not null return 1
}
int insertPost(LinkList linklist,Node node,DataType element){
Node temp = (Node)malloc(sizeof(struct SimpleLinkList));
// 前插 注意如果没有任何元素 那么把头结点指向 element
if(temp == NULL){
printf("insert fail");
return 0;
}else{
for(linklist;linklist!= NULL; linklist = linklist -> link) {
if(linklist -> link == node){
temp ->info = element;
linklist ->link = temp;
temp ->link = node;
}
}
}
return 1;
//前插的节点 是要我们自己传参注意 而不是把函数写成
}
// insert forward
//带头节点的链表 头结点没有值
// 其实 所谓的后插 是后插 但是现在的node是 链表 实际插入的时候
//所以 node的link是第一个数 所谓变成“前插”
int insertBack(LinkList linklist,Node node,DataType element){
Node temp = (Node)malloc(sizeof(struct SimpleLinkList));
if(temp == NULL){
printf("insert element fail!");
return 0;
}
temp -> info = element;
temp -> link = node -> link;
node -> link = temp;
return 1;
} //insert back
int printList(LinkList linklist){
if(linklist == NULL){
printf("it is null");
return 0;
}
while(linklist -> link != NULL){
printf("%2d",linklist->link->info);
linklist = linklist -> link ;
}
printf("\n");
return 1;
}
Node searchElement(LinkList linklist,DataType element){
Node node;
if(linklist == NULL){
printf("the element was not found");
return NULL;
}
node = linklist -> link;
while(node != NULL && node -> info != element){
node = node -> link;
}
if(node == NULL){
return NULL;
}
return node;
}
DataType showValue(LinkList linklist,Node node){
Node temp;
if(linklist == NULL){
printf("the element was not found");
return NULL;
}
temp = linklist -> link;
while(temp != NULL && temp -> link != node){
temp = temp -> link;
}
return node;
}
int deleteElement(LinkList linklist,DataType element){
Node node;
Node temp;
if(linklist == NULL){
printf("the element you deleted was not found");
return 0;
}
node = linklist ;
while(node ->link!= NULL && node ->link-> info != element){
// link 的info 是element之前。
node = node -> link;
// printf("test\n");link ->info 先要判断link为不为空!
}
// printf("test2");
if(node->link== NULL ){
printf("the element you deleted was not found\n");
return 0;
} else {
temp = node->link;
node -> link = temp -> link;
free(temp);
printf("the element is deleted\n");
return 1;
}
}
LinkList combine(LinkList one,LinkList another){
//终于知道错在哪里 节点没有分配 根本就不存在 数据结构就是数据结构
//原本是空的 malloc一个节点 插进去
//问题二: one ->link!= NULL 这是对的 while(one!= NULL)
//当one 为null了 也就没有link了 怎么 malloc 新的东西都是没用的。
Node temp ;
LinkList linken;
linken = one;
while(one ->link!= NULL)
one = one ->link;
for(another;another->link!= NULL; another = another ->link){
temp = (Node)malloc(sizeof(struct SimpleLinkList));
temp ->info = another ->link ->info;
temp ->link = another ->link ->link;
one ->link = temp;
one = one ->link;
}
return linken;
// linken 临时指向头节点 能返回整个表
}
main.c
#include "LinkList.h"
int main(){
int i,element;
LinkList linklist1 = CreateNUllList();
LinkList linklist2 = CreateNUllList();
LinkList linklist3 = CreateNUllList();
Node note = linklist1;
Node note2 = linklist1;
//if(note != NULL) printf("yes");
for(i = 0;i<10;i++){
while(note != NULL)
note = note -> link;
insertPost(linklist1, note,i);
}//终于完成 前插 使得
for(i = 0;i<10;i++){
insertBack(linklist2, linklist2,i);
}
//printf("%d",linklist->link->info);
printList(linklist1);
printList(linklist2);
/* printf("input the value of the element you search\n");
scanf("%d",&element);
if(searchElement(linklist1,element) == NULL)
printf("not found");
for(i=0;note2 != searchElement(linklist1,element);note2 = note2 ->link,i++ )
;//空语句 不执行
if(searchElement(linklist1,element) == NULL)
printf("not found\n");
else
printf("%d is the %dth element of the linklist\n",element,i);
printf("input the value of the element you delete\n");
// scanf("%d",&element);
//deleteElement(linklist1,element);
// printList(linklist1);
*/
linklist3 = combine(linklist1,linklist2);
printList(linklist3);
return 0;
}
一个月多多少少学了点。java的LinkList原来这样实现,单纯用的话很简单。