数据结构-链表创建,删除,插入,反转,连接

// StructList.cpp : Defines the entry point for the console application.
//顺序链表
//创建
//插入,头,中,末
//删除,头,中,末,整个链表
//反序
//相加


#include "stdafx.h"
#include <iostream>
using std::cout;
using std::cin;
using std::endl;


typedef struct tagList
{
int data;
struct tagList *next;
};
typedef struct tagList Node;
typedef Node *linkList;


linkList createLinkList(linkList head)
{
linkList newNode = NULL;
linkList currentNode = NULL;
int number;


head = new Node();
cout << "please input some numbers to createList: "; 
cin >> number;
head->data = number;
head->next = NULL;

currentNode = head;

while (1)
{
cout << "please input some numbers to createList: "; 
cin >> number;
if (number == 0)
{
break;
}
newNode = new Node();
newNode->data = number;
newNode->next = NULL;


currentNode->next = newNode;
currentNode = newNode;
}


return head;
}
linkList insert(linkList head, int choice)
{
linkList currentNode = head;
linkList newNode = NULL;
int number;
int posValue;


switch (choice)
{
case 1:
newNode = new Node();
cout << "please input one number for inserting at begin: ";
cin >> number;
newNode->data = number;


newNode->next = head;
head = newNode;
break;
case 2:
cout << "input one pos value you will insert one number after it: ";
cin >> posValue;


while (currentNode->data != posValue)
{
currentNode = currentNode->next;
}


newNode = new Node();
cout << "please input one number for inserting at middle: ";
cin >> number;
newNode->data = number;


newNode->next = currentNode->next;
currentNode->next = newNode;
break;
case 3:
currentNode = head;
while (currentNode->next != NULL)
{
currentNode = currentNode->next;
}


newNode = new Node();
cout << "please input one number for inserting at end: ";
cin >> number;
newNode->data = number;


newNode->next = currentNode->next;
currentNode->next = newNode;
break;
default:
break;
}


return head;
}
linkList deleteNode(linkList head, int key)
{
linkList currentNode = head;
linkList backNode = NULL;


if (key == head->data)//delete begin node
{
head = head->next;
delete currentNode;
return head;
}


while (currentNode != NULL)
{
if (key == currentNode->data)//delete middle and end node
{
backNode->next = currentNode->next;
delete currentNode;
break;
}
else
{
backNode = currentNode;
currentNode = currentNode->next;
}
}

return head;
}
linkList deleteLinkList(linkList head)
{
linkList currentNode = head;
while (currentNode != NULL)
{
currentNode = currentNode->next;
delete head;
head = currentNode;
}
return head;
}
linkList reverse(linkList head)
{
linkList backNode = head;
linkList nextNode = head->next;
linkList currentNode = nextNode->next;


head->next = NULL;
while (currentNode != NULL)
{
nextNode->next = backNode;//reverse
backNode = nextNode;//backNode forward
nextNode = currentNode;//nextNode forward
currentNode = currentNode->next;//currentNode forward
}
nextNode->next = backNode;//reverse
head = nextNode;
return head;
}


linkList addTwoLists(linkList head1, linkList head2)
{
linkList currentNode = head1;


while (currentNode->next != NULL)
{
currentNode = currentNode->next;
}
currentNode->next = head2;
return head1;
}


void printList(linkList head)
{
cout << "output is: ";
while (head != NULL)
{
cout << head->data << ' ';
head = head->next;
}
cout << endl;
return;
}


int _tmain(int argc, _TCHAR* argv[])
{
linkList head = NULL;
linkList head2 = NULL;
int choice;
int deleteNumber;


head = createLinkList(head);
printList(head);


cout << "your choice for inserting(1,2,3): ";
cin >> choice;
head = insert(head,choice);
printList(head);


cout << "input one number you will delete: ";
cin >> deleteNumber;
head = deleteNode(head, deleteNumber);
printList(head);


cout << "do you want to delete this list?(1 or 0)";
cin >> choice;
if (1 == choice)
head = deleteLinkList(head);
printList(head);


cout << "input 1 to reverse list: ";
cin >> choice;
if (1 == choice)
head = reverse(head);
printList(head);


head2 = createLinkList(head2);
head = addTwoLists(head, head2);
cout << "after adds, ";
printList(head);
return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值