本文记录链表和栈的基本代码操作。
链表的基本操作:
#include<stdio.h>
#include<stdlib.h>
typedef char datatype; //按照需求定义数据类型
typedef struct node //定义结点,结点是一个结构体
{
datatype data;
struct node *next;
} linklist; //结点的类型名称是 linklist
linklist *createlist()
{
char ch;
linklist *head, *s, *r;
//开辟头节点空间,并且把地址付给head
head = (linklist*)malloc(sizeof(linklist));
r = head; //r是指当前的结点
printf("请输入字符产生链表,以#结束\n");
ch = getchar();
while (ch != '#')
{
//开辟一个新的结点
s = (linklist*)malloc(sizeof(linklist));
s->data = ch;
r->next = s; //实现了结点相连
r = s; //更新当前结点
ch = getchar();
}
r->next = NULL;
return head; //返回头结点
}
linklist *get(linklist *head, int i)
{
int j;
linklist *p;
p = head; j = 0;
while ((p->next != NULL) && (j<i))
{
p = p->next;
j++;
}
if (i == j) return p;
else return NULL;
}
linklist *insert(linklist *head, int i, char x)
{
linklist *p, *s;
int j;
//产生一个新结点
s = (linklist*)malloc(sizeof(linklist));
s->data = x;
if (i == 0)
{
s->next = head;
head = s;
}
else
{
p = head; j = 1;
while (p != NULL&&j<i)
{
j++;
p = p->next; //移动结点位置,找到应该插入数据的位置
}
//接下来插入结点
if (p != NULL)
{
s->next = p->next;
p->next = s; //实现结点插入
}
else
printf("结点未找到\n");
}
return head;
}
linklist *dele(linklist *head, char i)
{
linklist *p, *q;
q = head;
p = head->next;
while (p != NULL&&p->data != i)
{
q = p; p = p->next;
}
if (p != NULL)
{
q->next = p->next; //指针的改变
free(p); //释放p所占用的结点内存
}
else
printf("结点未找到!\n");
return head;
}
void main()
{
linklist *head, *r; //定义两个指针型变量,变量是所定义
//的结点结构
int num, num1;
char char1, char2;
head = createlist(); //用函数createlist来实现链表的创建
printf("链表信息为:");
r = head->next;
while (r)
{
printf("%c", r->data);
r = r->next; //移动到下一个结点
}
printf("\n");
printf("请输入要查询的序号:\n");
scanf("%d", &num);
r = get(head, num); //用函数get来实现链表中元素的查询
if (r == NULL)printf("没有查到\n");
printf("查找结果为:%c\n", r->data);
printf("请输入要插入的位置:\n");
scanf("%d", &num1);
printf("请输入要插入的字符:\n");
getchar();
scanf("%c", &char1);
r = insert(head, num1, char1); //用函数insert来实现链表
//中元素的插入
//插入后将链表元素打印出来
r = head->next;
while (r)
{
printf("%c", r->data);
r = r->next;
}
printf("\n");
printf("请输入要删除的字符\n");
getchar();
scanf("%c", &char2);
r = dele(head, char2);
r = head->next;
while (r)
{
printf("%c", r->data);
r = r->next;
}
}
栈处理十六进制转换:
#include <stdio.h>
#include <stdlib.h>
#define maxsize 1024
typedef int datatype;
typedef struct
{
datatype elements[maxsize];
int Top;
}Stack;
void setNull(Stack *s)
{ s->Top=-1;}
int isfull(Stack *s)
{
if(s->Top>=maxsize-1)return(1);
else return(0);
}
int isempty (Stack *s)
{if(s->Top>=0)return(0);
else return(1);}
void push(Stack *s,datatype E)
{
if(s->Top>=maxsize-1)
{
printf("Stack Overflow");}
else
{
s->Top++;
s->elements[s->Top]=E;
}
}
datatype *pop(Stack *s)
{
datatype *temp;
if(isempty(s))
{
printf("Stack Underflow");
return(NULL);
}else
{
s->Top--;
temp=(datatype *)malloc(sizeof(datatype));
*temp=s->elements[s->Top+1];
return(temp);
}
}
void conversion(int n)
{
Stack s;
setNull(&s);
int r,m;
r=n;
while(r)
{
m=r%16;
if(isfull(&s))printf("Over flow\n");
else push(&s,m);
r=r/16;
}
printf("转换后的十六进制为\n");
while(!isempty(&s))
printf("%x",*(pop(&s)));
printf("\n");
}
void main()
{
int num;
printf("请输入需要转换为十六进制的十进制数据\n");
scanf("%d",&num);
conversion(num);
}