7.考研-数据结构-双链表的建立及基本操作算法

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
/*
双链表
1.尾插法建立双链表
2.在双链表中查找第一个值为X的节点,从第一个节点开始,边扫描边比较,若找到这样的节点
则返回节点指针,否则返回NULL
3.在双链表中p所指的节点之后插入一个节点s
4.删除双链表中p节点的后继节点

*/
#include "stdafx.h"
#include
using namespace std;
typedef struct node {
	int data;
	struct node *prior;
	struct node *next;
}node ,*LinkedList;
//创建一个双链表
LinkedList createDList(int a[],int n) {
	LinkedList s,r;
	LinkedList head=(LinkedList)malloc(sizeof(node));
	head->prior = NULL;
	head->next = NULL;

	r = head;//始终指向终端结点,开始时候头结点也是尾结点
	for (int i = 0; i < n; i++){
		s = (LinkedList)malloc(sizeof(node));
		s->data = a[i];
		//下面将s插入到head的尾部
		r->next = s;
		s->prior = r;
		r = s;
	}
	r->next = NULL;
	return head;
}
//展示双链表
void showList(LinkedList head) {
	LinkedList p=head->next;
	while (p!=NULL) {
		cout << p->data << "  ";
		p = p->next;
	}
}
//查找一个结点

LinkedList findNode(LinkedList head,int x) {
	LinkedList p = head->next;
	while (p!=NULL) {
		if (p->data==x) {
			break;
		}
		p = p->next;
	}
	return p;
}
//插入一个结点
void insertList(LinkedList head,int num,int position) {
	LinkedList p = head;
	for (int i = 0; i < position-1;i++) {
		p = p->next;
	}
	//创建一个结点s
	LinkedList s = (LinkedList)malloc(sizeof(node));
	s->data = num;
	s->next = p->next;
	s->prior = p;
	p->next = s;
	s->next->prior = s;//假如p指向最后一个结点,本行可以去掉
}
//删除一个结点
void deleteList(LinkedList head,int position) {
	LinkedList p = head;
	LinkedList q;
	for (int i = 0; i < position - 1;i++) {
		p = p->next;
	}
	//删除p结点的后继结点
	q = p->next;
	p->next = q->next;
	q->next->prior = p;
	free(q);
}
int main()
{
	int a[] = {1,3,5,9};
	int n = sizeof(a)/ sizeof(int);
	//cout << n << endl;
	LinkedList head = createDList(a,n);//创建一个双链表
	showList(head);//展示这个双链表
	//1.查找双链表
	cout << "\n请输入你要查找的值(返回结点node):" << endl;
	int x;
	cin >> x;
	LinkedList node= findNode(head,x);
	//showList(node);//当我输入1时候,这个打印359 是对的,因为打印里面我们设置的是头结点为空不打印,说明返回的结点是要查找的结点
	//2.插入结点算法
	int num, position;
	cout << "请输入要插入的位置:" << endl;
	cin >> position;
	cout << "请输入要插入的数值:" << endl;
	cin >> num;
	insertList(head,num,position);
	showList(head);
	//3.删除一个结点的算法
	cout << "\n请输入删除的位置:" << endl;
	cin >> position;
	deleteList(head,position);
	showList(head);
	//防止程序一闪而过
	int f;
	cin >> f;
    return 0;
}



你可能感兴趣的:(数据结构,考研-数据结构)