复习笔记 数据结构 第二章 线性表
说明:数据结构高分笔记上的经典编程题
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define dataSize 20
#define ERROR -1
using namespace std;
/*
题目:数据结构 cha2 线性表
内容:1. 顺序表的操作
日期:2018/3/9
时间:tomato * 2
笔记:1. 线性表包括顺序表和链表
2. 顺序表是逻辑和存储结构均为线性连续的数组形式,一般用数组表示
3.链表分为单链表和双链表,包括带头结点和不带头结点两种类型,也包括循环和非循环两种类型
还有一种特殊的“静态链表”
*/
/* 顺序表的定义方式
注意:typedef的含义是给这个结构体起的名字叫做Sqlist,是一种用户自定义的数据类型
而平时编程中struct student {}stu[20];则是C++中的简略写法,stu[20]即为创建的
数据类型为Student的数组变量
*/
typedef struct
{
int data[dataSize];
int length;
}Sqlist;
typedef int Elemtype;
/* (1)以下为顺序表的基本操作
1. 初始化
2. 按元素值的查找
3. 求指定位置元素
4. 插入元素
5. 删除元素
笔记:1.是否用&取决于改结构体的内容
*/
void initSqlist(Sqlist &l)
{
l.length = 0;
}
int findElem(Sqlist l,Elemtype x)
{
for (int i=0;i<l.length;i++)
{
if (l.data[i] == x)
return i;
}
return ERROR;
}
Elemtype getElem(Sqlist l, int loc)
{
if (loc < 0 || loc > l.length-1)
return ERROR;
return l.data[loc];
}
void insertSqlist(Sqlist &l,Elemtype x,int loc)
{
if (loc < 0 || loc >l.length-1)
cout<<"error";
for (int i=l.length-1 ; i >= loc ; i-- )
{
l.data[i+1] = l.data[i];
}
l.data[loc] = x;
l.length++; // ★★★ 勿忘!
}
Elemtype deleteSqlist(Sqlist &l,int loc,Elemtype &x)
{
if (loc<0||loc>l.length-1)
{cout << "error";return 0;}
x = l.data[loc];
for (int i=loc;i<l.length-1;i++)
{
l.data[i] = l.data[i+1];
}
l.length -- ;
return x;
}
// 单链表结点定义
typedef int Elemtype;
typedef struct LNode
{
Elemtype data;
struct LNode *next;
}LNode;
/*
(2)单链表的操作
1. 创建单链表 尾插法和头插法
2. 归并单链表 递增和递减(头插法)
3. 查找单链表
4. 插入单链表
5. 删除
6. 打印链表内容
7. 查找x并删除
*/
// 头插法
void createLNode(LNode *&h,int n)
{
// 1. 创建头结点
h = (LNode *)malloc(sizeof(LNode));
h->next = NULL;
Elemtype x;
cout<<"输入线性表数据"<<endl;
LNode *q;
q = h;
for(int i=0;i<n;i++)
{
cin >> x;
q = (LNode *)malloc(sizeof(LNode));
q->data = x;
q->next = h->next;
h->next = q;
}
}
// 尾插法
void createLNodeH(LNode *&h,int n)
{
h = (LNode *)malloc(sizeof(LNode));
h->next = NULL;
LNode *p,*q;
q = h;
int x;
cout <<"数据:"<<endl;
for (int i=0;i<n;i++)
{
cin >> x;
p = (LNode *) malloc(sizeof(LNode));
p->data = x;
q->next = p;
q = p;
}
p->next = NULL; // 最后赋值即可
}
void print(LNode *h)
{
LNode *t = h;
while (t->next!=NULL)
{
t = t->next;
cout<<t->data<<' ';
}
cout << endl;
}
void mergeLNode(LNode *&a,LNode *&b,LNode *&c)
{
LNode *pa,*pb,*pc;
pa = a->next;pb=b->next;
pc = (LNode *)malloc(sizeof(LNode));
c = pc ;
while (pa!=NULL && pb!=NULL)
{
cout <<"test"<<endl;
if (pa->data >= pb->data)
{
pc->next = pb;
pb = pb->next;
pc = pc->next;
}
else
{
pc->next = pa;
pa = pa->next;
pc = pc->next;
}
}
pc->next = NULL;
if (pa!=NULL)
{
pc->next = pa;
}
if (pb!=NULL)
{
pc->next = pb;
}
}
void merge_2(LNode *&a,LNode *&b,LNode *&c)
{
LNode *pa,*pb,*pc;
pa = a->next; pb = b->next;
c = (LNode *)malloc(sizeof(LNode));
pc = c;
while (pa!=NULL && pb!=NULL)
{
if (pa->data >= pb->data)
{
pc = pb;
pb = pb->next;
pc -> next = c->next;
c->next = pc;
}
else
{
pc = pa;
pa = pa->next;
pc -> next = c->next;
c->next = pc;
}
}
while (pa!=NULL)
{
pc = pa;
pa = pa->next;
pc -> next = c->next;
c->next = pc;
}
while (pb!=NULL)
{
pc = pb;
pb = pb->next;
pc -> next = c->next;
c->next = pc;
}
}
int findAndDelete(LNode *l,Elemtype x)
{
LNode *p = l,*q;
while (p->next!=NULL)
{
if (p->next->data == x)
{
q = p->next ;
p->next = q->next;
return 1;
}
p = p->next;
}
return 0;
}
// 双链表结点定义
typedef struct DLNode
{
Elemtype data;
struct DLNode *prior;
struct DLNode *next;
}DLNode;
/*
1.双链表的建立
2. 查找结点
3. 插入结点,在p之后
*/
void createDLNode(DLNode *&dl,int n)
{
dl = (DLNode *)malloc(sizeof(DLNode));
dl ->prior = NULL;
DLNode *p,*q;
p = dl;
cout<<"data:"<<endl;
int x;
for (int i=0;i<n;i++)
{
q = (DLNode *)malloc(sizeof(DLNode));
cin >> x;
q->data = x;
p->next = q;
q->prior = p;
p = q;
}
p->next = NULL;
}
int main()
{
DLNode *dl;
int n;
cout<<"数据个数n:"<<endl;
cin>>n;
createDLNode(dl,n);
print(dl);
return 0;
}