尾插法代码java 尾插法怎么理解
想存入一个链表之后以$结束(使用尾插法),输出当前链表,再删除第i个位置的元素,最后输出最终的链表?
#includestdio.h
创新互联公司是一家专注于成都网站设计、成都网站建设与策划设计,定南网站建设哪家好?创新互联公司做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:定南等地区。定南做网站价格咨询:13518219792
#includestdlib.h
#includemalloc.h
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node,*Linklist;
//以下是菜单选择函数
int menu_select()
{
int sn;
printf("\n");
printf(" 主菜单\n");
printf("*********************\n");
printf(" 1.单链表的建立\n");
printf(" 2.单链表的结点的删除\n");
printf(" 3.单链表的输出\n");
printf(" 0.退 出 \n");
printf("*********************\n");
printf(" 请选择0---3: ");
for(;;)
{
scanf("%d",sn);
if(sn0||sn3)
printf("\n\t输入错误,重选?0---3: ");
else
break;
}
return sn;
}
//通过键盘输入链表中元素值,利用尾插法建单链表L。
Linklist CreateFromTail()
{
Linklist phead = (Linklist)malloc(sizeof(Node));
phead-next = NULL;
phead-data = NULL;
Linklist ptail = phead;
ptail-next = phead;
getchar();
char ch;
int i=0;
while(ch = getchar())
{
if(ch != ',' ch != '$')
i = i*10+ch-'0';
if(ch == ',' )
{
Linklist pnew = (Linklist)malloc(sizeof(Node));
pnew-data = i;
i = 0;
ptail-next = pnew;
ptail = pnew;
pnew-next = NULL;
}
if(ch == '$')
break;
}
getchar();
return phead;
}
//在带头结点的单链表L中删除第i个元素。
void DelList(Linklist L,int i)
{
Linklist ptail = NULL;
while(L-next-data != i L-next != NULL)
L = L-next;
if(L-next == NULL)
{
printf("删除i的位置不成立!");
return ;
}
ptail = L-next;
L-next = L-next-next;
free(ptail);
return ;
}
//输出链表中的值。
void output(Linklist L)
{
while(L-next != NULL)
{
L = L-next;
printf("%d ",L-data);
}
return;
}
//释放内存
void free_list(Linklist L)
{
Linklist p;
while(L != NULL)
{
p = L;
L = L-next;
free(p);
}
return;
}
//主控菜单处理调试程序。
int main()
{
Linklist L = NULL;
int i;
for(;;)
{
switch(menu_select())
{
case 1:
printf("\n单链表的建立");
printf("请输入链表中结点的值(如:1,2,3,.....10,$ is end): \n");
L=CreateFromTail();
break;
case 2:
printf("链表结点的删除\n");
printf("请输入被删除结点的序号i:");
scanf("%d",i);
DelList(L,i);
printf("\n");
printf("\n");
break;
case 3:
printf("输出链表中结点的值: ");
output(L);
printf("\n");
break;
case 0:
printf("再见?\n");
free_list(L);
return 0;
}
}
}
为什么链表的第一个结点没有数据呢?我用的是不含头结点的尾插法,代码如下:
你这个head就是头结点啊,初始化以后并没有插入数据,通过p将head的next指向s,不断创建新节点s赋值,head作为第一个结点并没有数据
JAVA大师请进啊,帮忙
public class SeqLinkOps implements SeqLinkInterface{
private SeqLink head = new SeqLink();
//实现所有接口函数
public void Rear_Create() {
SeqLink r = new SeqLink();
r = head = null;
String s;
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader buf = new BufferedReader(isr);
System.out.println("请输入用,号隔开的一组数据");
try {
s = buf.readLine();
StringTokenizer fenxi = new StringTokenizer(s, ",");
while (fenxi.hasMoreTokens()) {
SeqLink link = new SeqLink(fenxi.nextToken());
if (head == null)
head = link;
else
r.next = link;
r = link;
}
if (r != null)
r.next = null;
} catch (IOException e){
e.printStackTrace( );
}
}
public void Front_Create() {
SeqLink r = new SeqLink();
r = head = null;
String s;
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader buf = new BufferedReader(isr);
System.out.println("请输入用,号隔开的一组数据");
try {
s = buf.readLine();
StringTokenizer fenxi = new StringTokenizer(s, ",");
while (fenxi.hasMoreTokens()) {
SeqLink link = new SeqLink(fenxi.nextToken());
if (head == null)
head = link;
else
r.next = head;
r = head;
}
if (r != null)
r.next = null;
} catch (IOException e){
e.printStackTrace( );
}
}
public void Rear_Create_Head() {
SeqLink r = new SeqLink();
r = head;
String s;
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader buf = new BufferedReader(isr);
System.out.println("请输入用,号隔开的一组数据");
try {
s = buf.readLine();
StringTokenizer fenxi = new StringTokenizer(s, ",");
while (fenxi.hasMoreTokens()) {
SeqLink link = new SeqLink(fenxi.nextToken());
if (head == null)
head = link;
else
r.next = link;
r = link;
}
if (r != null)
r.next = null;
} catch (IOException e){
e.printStackTrace( );
}
}
public void print() {
SeqLink ptr;
ptr=head.getNext();
while(ptr!=null){
System.out.print(" "+ptr.getData()+"-");
ptr=ptr.getNext();
}
System.out.println(" NULL");
}
java利用控制台输入数据建立单链表,我的代码出现java.lang.OutOfMemoryError,不知道怎么解决请大虾指教
public static void main(String[] args) {
Node h = new Node(); // 建立头结点
h.next = null; // 使头结点的指针域为空
Scanner input = new Scanner(System.in);
String[] str = input.nextLine().split(" ");
int i = 0;
Node t = h;
for (String s:str) { // 尾插法
int j = Integer.parseInt(s);
Node p = new Node(j);
p.next = null;
t.next = p;
t = p; // t始终指向最后一个元素
}
while (h.next != null) {
System.out.print(h.next.data);
h = h.next;
}
}
这样改改吧 , 你的i一直没变, 死循环,内存约占越多
各位java的高手啊 我们老师说这个是头插法 怎样改为尾插法呢 帮忙改一下代码呗
package com.test;
class node {
int data;
node next;
node(int data, node next) {
this.data = data;
this.next = next;
}
node(int data) {
this.data = data;
}
}
class ilink {
node head;
ilink() {
}
void insert(int a) {
if (head == null) {
head = new node(a);
head.next = null;
} else {
node temp = head;
while (temp.next != null) {
temp = temp.next;
}
node newNode = new node(a);
newNode.next = null;
temp.next = newNode;
}
}
void print() {
while (head != null) {
System.out.print(head.data + "\t");
head = head.next;
}
}
}
public class Test {
public static void main(String[] args) {
int[] b = { 1, 2, 3, 4, 5 };
ilink il = new ilink();
for (int i = 0; i 5; i++)
il.insert(b[i]);
il.print();
}
}
就是把ilink中的insert改了一下,原来的头插法是把后来的数字放在链表的最开始,这样程序输出是数组的倒序5 4 3 2 1,尾插法是把新插入的数字放在链表的最后面,这样输出为1 2 3 4 5。
java 链表的输出问题
几位的回答都比较清楚了,我想另外说点问题
你本就不应该加入‘表尾’这个属性,在数据结构中链表的特点就是能用一个地址带一个长串数据链的,不用这个属性的话思路会更加清晰。我也用java模拟过一些基本数据结构:
public class MyNodeT {
public T value;
public MyNodeT next;
public MyNode() {
}
public MyNode(T value) {
this.value = value;
}
public MyNode(MyNodeT t) {
this.value = t.value;
this.next = t.next;
}
public void connect(MyNodeT t){
this.next = t;
}
@Override
public String toString() {
return null==value?"":value+"-";
}
}
在这个节点定义的基础上的链表定义:
public class MyLinkListT{
public MyNodeT next;
public MyLinkList() {
this.next = new MyNodeT();
}
public MyLinkList(T[] tList) {
if(tList.length==0)return;
next = new MyNodeT(tList[0]);
MyNodeT temp = next;
for (int i = 1; i tList.length; i++) {
temp.connect(new MyNodeT(tList[i]));
temp = temp.next;
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
MyNodeT t = next;
while (null != t) {
sb.append(t);
t = t.next;
}
return sb.toString();
}
}
然后是相关的操作类:
public class LinkListAction {
MyLinkListComparable list;
public LinkListAction(MyLinkListComparable list) {
this.list = list;
}
/**
* 头插法建立单链表(数组)
* */
public void createFromHead(Comparable...objects){
MyNodeComparable start;
for (int i = 0; i objects.length; i++) {
start = new MyNodeComparable(objects[i]);
start.next = list.next;
list.next = start;
}
}
/**
* 尾插法建立单链表(数组)
* */
public void createFromTail(Comparable...objects){
MyNodeComparable start;
MyNodeComparable end = list.next;
for (int i = 0; i objects.length; i++) {
start = new MyNodeComparable(objects[i]);
end.next = start;
end = start;
}
end.next = null;
}
/**
* 在单链表中查找第i个结点
* */
public MyNodeComparable get(int i){
if(i 0)return null;
MyNodeComparable node = list.next;
int index = 0;
while (node != null index i) {
node = node.next;
index++;
}
return node;
}
/**
* 在单链表中的按值查找
* */
public MyNodeComparable locate(Comparable obj){
if(null == obj)return new MyNodeComparable();
MyNodeComparable node = list.next;
while (node != null !obj.equals(node.value)) {
node = node.next;
}
return node;
}
/**
* 求单链表的长度
* */
public int getLength(){
int length = 0;
MyNodeComparable node = list.next;
while(null != (node = node.next)){
length++;
}
return length;
}
/**
* 单链表的插入操作(按位置)
* */
public void insert(Comparable obj,int location){
int length = 0;
MyNodeComparable node = list.next;
while(node!=null location != length++){node = node.next;}
if(null == node)throw new RuntimeException("插入位置有误!");
MyNodeComparable inserter = new MyNodeComparable(obj);
inserter.next = node.next;
node.next = inserter;
}
/**
* 删除数据
* */
public Comparable delete(int i){
int length = 0;
MyNodeComparable node = list.next;
while(node!=null i != length++){node = node.next;}
if(null == node)throw new RuntimeException("删除位置有误!");
Comparable o = node.next.value;
node.next = node.next.next;
return o;
}
/**
* 合并两个有序的单链表
* */
public static MyLinkListComparable mergeLinkList(MyLinkListComparable la,MyLinkListComparable lb){
MyLinkListComparable lc = new MyLinkListComparable();
MyNodeComparable pc = lc.next;
MyNodeComparable pa = la.next.next;
MyNodeComparable pb = lb.next.next;
while(null != pa || null != pb){
if(null == pa){
pc.next = pb;
break;
}
if(null == pb){
pc.next = pa;
break;
}
if(pa.value.compareTo(pb.value) = 0){
pc.next = pa;
pa = pa.next;
}
else {
pc.next = pb;
pb = pb.next;
}
pc = pc.next;
}
return lc;
}
@Override
public String toString() {
return list.toString();
}
public static void main(String[] args) {
MyLinkListComparable list1 = new MyLinkListComparable();
MyLinkListComparable list2 = new MyLinkListComparable();
LinkListAction lla = new LinkListAction(list1);
// lla.createFromHead(1,3,4,6,8,10);
lla.createFromTail(1,3,4,6,8,10);
LinkListAction llb = new LinkListAction(list2);
llb.createFromTail(2,5,7,9,11);
System.out.println(lla);
System.out.println(llb);
// System.out.println(lla.locate(7));
// System.out.println(lla.getLength());
//
// lla.insert(20, 6);
// System.out.println(lla);
// System.out.println(lla.delete(4));
System.out.println(LinkListAction.mergeLinkList(lla.list, llb.list));
System.out.println(lla);
System.out.println(llb);
}
}
我还写了一些其他的简单数据结构,感兴趣的话,你可以Hi我一下,呵呵。
圣诞快乐!
本文标题:尾插法代码java 尾插法怎么理解
文章转载:http://scyanting.com/article/doddeph.html