java销毁链表_链表——C和Java实现

网速可以再卡一点吗

——原始——

C语言实现的单链表

#include 

#include 

#include 

typedef struct _Node

{

char name[32];

struct _Node *next;

} Node;

typedef struct _Node *PtrNode;//建立指向_Node类型数据的指针*PtrNode

void InitList(PtrNode *ls)//初始化链表

{

*ls = (PtrNode)malloc(sizeof(Node));

strcpy((*ls)->name, "Nothing"); //默认name值为Noting

(*ls)->next = NULL;//默认为空指针

}

void CreateList(PtrNode ls, int n)//尾插法建立链表,结点数为n个

{

PtrNode p, rear;

char tmpName[32];//声明字符数组

int i;

rear = ls;

for(i=0; i

{

p = (PtrNode)malloc(sizeof(Node));

scanf("%s", tmpName);

strcpy(p->name, tmpName);

rear->next = p;  //给p节点的name、next赋值

rear = p;   //rear回到链表最后位置

}

rear->next = NULL;  //链表尾节点指向空

}

void TraverseList(PtrNode ls) //遍历打印

{

PtrNode p=ls->next;//p指向第一个结点

while(p!=NULL)

{

printf("%s->", p->name);

p = p->next;

}

printf("null\n");

}

PtrNode LocateElem(PtrNode ls, char key_name[32])//查找name值等于参数key_name的第一个结点,没有则返回空

{

PtrNode p, q;

p = ls;

q = ls->next;

while(q!=NULL)

{

if(strcmp(q->name, key_name)==0)

break;  //找到与key_name相等的元素后直接跳出循环

p = q;

q = q->next;

}

if(q==NULL)

return NULL;

else

return p;//此时p->next就是要找的结点

}

PtrNode GetElem(PtrNode ls, int j)//找到链表中第j个结点

{

PtrNode p=ls;

int i=0;

if(j<0) return NULL;//参数不能小于0

while(p!=NULL&&i

{

p=p->next;

i++;

}

return p;

}

void InsertNode(PtrNode p, char newName[32])//将name值为newName的新结点插入到p的当前位置,p自动后移

{

PtrNode s = (PtrNode)malloc(sizeof(Node));

strcpy(s->name, newName);

s->next = p->next;

p->next = s;

}

void DeleteNode(PtrNode p)//删除结点p

{

PtrNode s=p->next;//暂存p的next值

if(s!=NULL)

{

p->next = s->next;

free(s);//销毁这个结点

}

}

void DestroyList(PtrNode *ls)//销毁链表ls

{

PtrNode p = *ls, q;

while(p!=NULL)//用p遍历ls,依次销毁ls的每一个结点

{

q = p;

p = p->next;

free(q);

}

*ls = NULL;

}

int GetLength(PtrNode ls)//返回ls的结点个数

{

PtrNode p=ls->next;

int i=0;

while(p!=NULL)

{

p=p->next;

i++;

}

return i;

}

void BubbleSort(PtrNode ls)//对链表进行冒泡排序,最终为升序

{

int i, j, n = GetLength(ls);

int bFlag=1;

char tmpName[32];

PtrNode p, q;

for(i=0; i

{

bFlag = 0;

p = ls->next;

for(j=0; j

{

q = p->next;

if(strcmp(p->name, q->name)>0)//strcmp:比较英文字符串大小,参数1大于参数2时执行if内的语句

{         //百度百科:strcmp

strcpy(tmpName, p->name);

strcpy(p->name, q->name);

strcpy(q->name, tmpName);//对调p和q的name值

bFlag = 1;

}

p = p->next;

}

}

}

//-------------------------------------------

int main()

{

int n=4;

PtrNode myLkList, pNode;

char keyName[32], newName[32];

InitList(&myLkList);//初始化

CreateList(myLkList, n);//插入4个结点

TraverseList(myLkList);//遍历打印

printf("请输入要查找的关键字\n");

scanf("%s", keyName);//输入要查找的keyName

pNode=LocateElem(myLkList, keyName);//pNode为此keyName的位置下标

if(pNode!=NULL)//若存在这个keyName就在这个结点的下一个位置插入一个新结点

{

printf("请输入要添加的新结点\n");

scanf("%s", newName);

InsertNode(pNode, newName);

}

TraverseList(myLkList);//遍历打印

pNode = GetElem(myLkList, 4);//查到到第4个结点

if(pNode!=NULL)//将此结点之后的统统删除

DeleteNode(pNode);

printf("删除第四个以后的结点:\n");

TraverseList(myLkList);//遍历打印

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值